c++ - 为什么枚举不能是模板?

标签 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 底层类型的限制,如果 enum 底层类型可以被模板化,那么它可能会导致 ill-formed enums,但是当我们试试这个:

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
};

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.

枚举不是这两者,所以它不能是模板。

关于c++ - 为什么枚举不能是模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21914457/

相关文章:

c++ - 显示 wxGrid 编辑器时如何捕获 KeyEvents

templates - FreeMarker 模板 : how to use combined conditions in <#if> </#if> block?

c++ vector 通过使用 .push_back 或 .resize() 避免重新分配

c++ - regex_match 抛出运行时异常

C++ 基本模板类构造函数

c++ - 广义复制构造函数

c++ - 为什么迭代器不依赖于分配器? (也就是说,让迭代器变得可怕不会违反分配器的 typedef 抽象吗?)

function - 引用类方法

c++ - 解决 VC++12 中的模板特化错误?

c++ - 在C++中交换短语中单词的前两个字母