我使用了这段代码:
enum E {
E1, E2, E3, MaxNum
};
const char * ENames[ MaxNum ] = {
"E1", "E2", "E3"
};
并没有问题。
现在我想使用“现代”enum class
。代码现在看起来像这样:
enum class E {
E1, E2, E3, MaxNum
};
const char * ENames[ E::MaxNum ] = {
"E1", "E2", "E3"
};
并收到错误
错误:数组'ENames'的大小具有非整数类型'E'
错误:'const char * [1]'
的初始化程序太多
问:为什么enum class
在c ++ 11中变成非整数,而通常的枚举是不可或缺的?
问题的决定是什么?如何声明一个大小的数组,即enum class
中的枚举?
此处 - http://ideone.com/SNHTYe - 是一个简单的例子。
谢谢。
答案 0 :(得分:7)
问:为什么
enum class
在c ++ 11中变成非整数,而通常的枚举是不可或缺的?
因为它不是“通常的枚举”,所以它的类型更强烈
如何声明一个大小的数组,即枚举类中的枚举?
为什么你还想要?您可以使用static_cast
但问题的解决方案是“不要这样做”。
如果你想要一个固定底层类型的枚举然后这样做,不要使用作用域枚举:
enum E : uint16_t {
E1, E2, E3, MaxNum
};
const char * ENames[ MaxNum ] = {
"E1", "E2", "E3"
};
答案 1 :(得分:5)
C ++ 11 5.19 / 3“常量表达式”
整数常量表达式是整数或 unscoped 枚举类型的文字常量表达式。
范围枚举不是整数常量表达式。数组维度(如果指定)必须是“一个整数常量表达式,其值应大于零”(8.3.4 / 1“数组”)。
我怀疑这样做的理由是,范围内的枚举不会隐式转换为int
。
要解决此问题,您可以按照user2523017的建议将作用域枚举静态强制转换为int
,或者使用ccl 11枚举枚举名称的前C ++ 11方法:
namespace E {
enum {
E1, E2, E3, MaxNum
};
}
或:
struct E {
enum {
E1, E2, E3, MaxNum
};
};