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
类型遵循与枚举底层类型相同的限制,它就可以毫无问题地编译,你知道,定义枚举值的表达式:
- 应该是一个整数常量,大到足以容纳枚举的所有值
- 每个枚举类型都应与
char
或signed
/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/