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

枚举不能是模板是我尝试用
BCC64(基于Clang)编译时给出的错误代码如下:

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

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

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

只要A类型遵循与enum底层类型相同的限制,它就可以编译而没有问题,你知道,定义枚举值的表达式:

>应该是一个足够大的整数常量,以适应​​枚举的所有值
>每个枚举类型应与char或有符号/无符号整数类型兼容.

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

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

non-integral type ‘fooClass’ is an invalid underlying type

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

感谢您的关注.

最佳答案 根据定义[C标准14.1],或在定义之外,

A template defines a family of classes or functions or an alias for a
family of types.

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

点赞