我用过这段代码:
enum E {
E1, E2, E3, MaxNum
};
const char * ENames[ MaxNum ] = {
"E1", "E2", "E3"
};
Run Code Online (Sandbox Code Playgroud)
并没有问题.现在我想用"现代" enum class.代码现在看起来像这样:
enum class E {
E1, E2, E3, MaxNum
};
const char * ENames[ E::MaxNum ] = {
"E1", "E2", "E3"
};
Run Code Online (Sandbox Code Playgroud)
并得到一个错误
错误:数组'ENames'的大小具有非整数类型'E'
错误:'const char*[1]'的初始化程序太多
问:为什么enum class在c ++ 11中变成非整数,而通常的枚举是不可或缺的?
什么是问题的决定?如何声明一个大小的数组,这是枚举中的一个enum class?
这里 - http://ideone.com/SNHTYe--就是一个简单的例子.
谢谢.
问:为什么
enum class在c ++ 11中变成非整数,而通常的枚举是不可或缺的?
因为它不是"通常的枚举",所以它的类型更强烈
如何声明一个大小的数组,这是枚举类中的枚举之一?
无论如何你还想要什么?您可以使用static_cast但问题的解决方案是"不要那样做".
如果你想要一个固定底层类型的枚举然后这样做,不要使用作用域枚举:
enum E : uint16_t {
E1, E2, E3, MaxNum
};
const char * ENames[ MaxNum ] = {
"E1", "E2", "E3"
};
Run Code Online (Sandbox Code Playgroud)
C++ 11 5.19/3"常量表达式"
整数表达式是积分或的常量表达式无作用域枚举类型.
范围枚举不是整数常量表达式.并且数组维度(如果指定)必须是"整数常量表达式,其值应大于零"(8.3.4/1"数组").
我怀疑这个的基本原理是作用域枚举不会隐式转换为int.
要解决此问题,您可以int按照user2523017的建议静态转换作用域枚举,或使用ccl 11枚举枚举名称的前C++ 11方法:
namespace E {
enum {
E1, E2, E3, MaxNum
};
}
Run Code Online (Sandbox Code Playgroud)
要么:
struct E {
enum {
E1, E2, E3, MaxNum
};
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4540 次 |
| 最近记录: |