为什么枚举不能成为模板?

时间:2014-02-20 16:55:03

标签: c++ templates c++11 enum-class

enumeration cannot be a template是我尝试使用BCC64(基于Clang)编译以下代码时给出的错误:

template <typename T> enum class fooEnum : T
{
    a,b,c,d,e
};

起初,我认为这个明确的禁止是由于enum基础类型限制,如果枚举基础类型可能被模板化,那么它可能导致形成不良的枚举,但是当我们尝试这个:

template <typename A> struct fooClass
{
    enum class fooEnum : A
    {
        a,b,c,d,e
    };
};

只要A类型遵循与enum底层类型相同的限制(即知道定义枚举值的表达式),它就会毫无问题地编译:

  • 应该是一个足够大的整数常量,以适应​​枚举的所有值
  • 每个枚举类型应与charsigned / unsigned整数类型兼容。

如果我们不遵循此规则,(使用类内或全局枚举)会出现另一个特定错误,如预期的那样:

enum class fooEnum : fooClass
{
    a,b,c,d,e
};
  

非整数类型'fooClass'是无效的基础类型

所以,这就是为什么我想知道为什么明确禁止创建模板枚举,即使已经有对基础类型的控制。标准在哪里被提到这个禁令?

感谢您的关注。

2 个答案:

答案 0 :(得分:1)

您可以通过在类中声明枚举(仅包含该类)来对问题进行排序。

这是代码

#include <iostream>
using namespace std;

template <typename T>
struct myEnum
{
    enum Values
    {
        a=0, b=1,c=2
    };
};

int main() {
    myEnum<int> abc;
    cout<<abc.Values::a<< abc.Values::b<<abc.Values::c;
    // your code goes here
    return 0;
}

输出:012

使用http://ideone.com/

进行测试

答案 1 :(得分:1)

根据定义[C ++标准14.1],或在定义之外,

  

模板定义了一系列类或函数或a的别名   家庭的类型。

枚举既不是这些,也不是模板。