6

我使用了这段代码:

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”</p>

错误:'const char* [1]' 的初始化程序太多</p>

问:为什么enum class在 c++11 中变得非整数,而通常的枚举是整数?

什么是一个问题的决定?如何声明一个大小为枚举的数组enum class

这里 - http://ideone.com/SNHTYe - 是一个简单的例子。

谢谢你。

4

2 回答 2

7

问:为什么enum class在 c++11 中变得非整数,而通常的枚举是整数?

因为它不是“通常的枚举”,所以它是更强类型的

如何声明一个大小为枚举类中的枚举之一的数组?

为什么你还想要?您可以使用 astatic_cast但解决问题的方法是“不要那样做”。

如果您想要一个固定基础类型的枚举,那么请不要使用范围枚举:

enum E : uint16_t {
    E1, E2, E3, MaxNum
};

const char * ENames[ MaxNum ] = {
    "E1", "E2", "E3"
};
于 2013-06-28T08:45:23.963 回答
5

C++11 5.19/3“常量表达式”

整型常量表达式是整型或无范围枚举类型的字面常量表达式

作用域枚举不是整数常量表达式。并且数组维度(如果指定)必须是“整数常量表达式,其值应大于零”(8.3.4/1“数组”)。

我怀疑这样做的理由是作用域枚举不会隐式转换为int.

要解决此问题,您可以int按照 user2523017 的建议将作用域枚举静态转换为 an,或使用 C++11 之前的方法来确定枚举名称的作用域:

namespace E {
enum {
      E1, E2, E3, MaxNum
    };
}

或者:

struct E {
enum {
      E1, E2, E3, MaxNum
    };
};
于 2013-06-28T07:47:12.633 回答