C++11 使用c+时,数组的大小为非整数类型+;11枚举类
我使用了以下代码:C++11 使用c+时,数组的大小为非整数类型+;11枚举类,c++11,enums,C++11,Enums,我使用了以下代码: enum E { E1, E2, E3, MaxNum }; const char * ENames[ MaxNum ] = { "E1", "E2", "E3" }; 而且没有问题。 现在我想使用“modern”enum类。代码现在如下所示: enum class E { E1, E2, E3, MaxNum }; const char * ENames[ E::MaxNum ] =
enum E {
E1, E2, E3, MaxNum
};
const char * ENames[ MaxNum ] = {
"E1", "E2", "E3"
};
而且没有问题。
现在我想使用“modern”enum类
。代码现在如下所示:
enum class E {
E1, E2, E3, MaxNum
};
const char * ENames[ E::MaxNum ] = {
"E1", "E2", "E3"
};
我犯了一个错误
错误:数组“ENames”的大小具有非整数类型“E”
错误:“常量字符*[1]”的初始值设定项太多
问:为什么enum类在c++11中变为非整数,而通常的enum是整数
什么是问题的决定?如何声明大小为的数组,即enum类中的枚举之一
这里是一个简单的例子
谢谢。C++11 5.19/3“常量表达式”
整型常量表达式是整型或无范围的枚举类型的文字常量表达式
作用域枚举不是整型常量表达式。数组维数(如有规定)必须是“整型常量表达式,其值应大于零”(8.3.4/1“数组”)
我怀疑这样做的理由是作用域枚举不会隐式转换为int
要解决此问题,您可以按照user2523017的建议,将作用域枚举静态强制转换为int
,或者使用C++11之前的枚举名称作用域方法:
namespace E {
enum {
E1, E2, E3, MaxNum
};
}
或:
问:为什么enum类在c++11中变为非整数,而通常的enum是整数
因为它不是“普通枚举”,所以它的类型更强
如何声明具有大小的数组,即枚举类中的枚举之一
你为什么要这么做?您可以使用static\u cast
,但问题的解决方案是“不要这样做”
如果需要固定基础类型的枚举,请执行此操作,不要使用作用域枚举:
enum E : uint16_t {
E1, E2, E3, MaxNum
};
const char * ENames[ MaxNum ] = {
"E1", "E2", "E3"
};
您可以将其强制转换为底层类型const char*ENames[static_cast(E::MaxNum)]={“E1”、“E2”、“E3”}代码>@user2523017谢谢。我不知道基本的\u类型
。我想,你应该把它作为一个答案。我不理解你的“为什么”问题:枚举类的全部要点当然是它们是一种不可隐式转换的独特类型。现在,这是否真的可行是一个完全不同的问题。IMHO C++11枚举类是非常无用的。@KonradRudolph你是对的,但这是我第一次看enum类
,我不知道(直到现在)关于与它们之间的隐式/显式转换的所有详细信息我没有给出答案,因为它只解决了您问题的一部分,而且我不熟悉作用域和强类型枚举背后的完整设计原理。不过,在你的答案中可以随意使用它!感谢标准的引用、关于隐式转换的解释以及尝试解决问题,但我不想使用C++11之前的方法,因为我想为我的枚举指定一个类型:enum class E:uint16\u t
forexample@borisbn,您不需要使用作用域枚举来拥有固定的基础类型,只需编写enum E:uint16_t
+1从未意识到可以指定基础类型,并且enum
保持不受范围限制。每天(正确地说-小时)我都在学习新的东西。。。我认为,指定基础类型只能用于作用域枚举(也称为枚举类)。多谢各位/我去学习有关枚举的标准)
enum E : uint16_t {
E1, E2, E3, MaxNum
};
const char * ENames[ MaxNum ] = {
"E1", "E2", "E3"
};