使用c ++ 11枚举类时,数组的大小具有非整数类型

时间:2013-06-28 07:13:41

标签: c++11 enums

我使用了这段代码:

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 - 是一个简单的例子。

谢谢。

2 个答案:

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