为什么枚举类型不能作为模板?

6
当我尝试使用BCC64(基于Clang)编译以下代码时,出现“枚举不能是模板”的错误:
template <typename T> enum class fooEnum : T
{
    a,b,c,d,e
};

起初,我认为这个显式禁止是由于枚举底层类型的限制,如果枚举底层类型可以作为模板参数,那么可能会导致不合规的枚举,但当我们尝试这样做时:
template <typename A> struct fooClass
{
    enum class fooEnum : A
    {
        a,b,c,d,e
    };
};

只要类型A遵循与枚举基础类型相同的限制,也就是定义枚举值的表达式,它就可以编译通过:
  • 必须是一个整数常量,足以容纳枚举的所有值
  • 每个枚举类型必须与charsigned/unsigned整数类型兼容。
如果我们不遵循这些规则(使用类内或全局枚举),会出现另一个特定的错误,如预期所示:
enum class fooEnum : fooClass
{
    a,b,c,d,e
};

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

因此,我想知道为什么即使已经对基础类型有控制,也明确禁止创建模板枚举。在标准文档的哪里提到了这个禁令?

感谢您的关注。


C++11中只有类和函数模板。(C++14将改变这一点)。尽管使用"class"关键字声明,但作用域枚举不是类。 - n. m.
我知道C++14的模板变量,也知道强枚举不是类。但事实上,我不知道为什么强枚举不能将其基础类型作为模板,这背后有什么逻辑(或非逻辑)原因来明确禁止它呢? - PaperBirdMaster
没有充分的理由。标准就是这样规定的,仅此而已。 - n. m.
2个回答

3

根据[C++标准14.1]的定义,或者因为它不在定义之内,

模板定义了一组类、函数或类型族的别名。

枚举既不是这些东西,所以它不能是一个模板。


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/进行测试。

你忘记将枚举定义为枚举类了 ;) - PaperBirdMaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接