1

我想使用具有默认 int 实现的 C++11 范围枚举:

enum class Color
{
    gray          = 1,  
    red           = 2
};

这使用 gcc 编译,但是:

Color color = Color::red;  // 'Color' is not a class or a namespace
Color color = red;         // 'red' was not declared in this scope

我究竟做错了什么?

编辑:

这应该是可编译的,但至少对我来说不是。我正在使用 gcc 版本 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)。当我尝试:

 make -std=c++0x -w in /home/martin/Projects/StrongTypedEnums-build-desktop 

我明白了

:-1: error: invalid option -- '='. 

我正在通过 IDE 做所有事情,并且对传递编译器参数一无所知。

enum class Color
{
    gray          = 1,
    red           = 2
};

int main(int argc, char *argv[])
{
    Color color = Color::red; // 'Color' is not a class or a namespace
    return 0;
}
4

2 回答 2

4

强类型枚举需要作用域。您必须在它们前面加上EnumName::,就好像它们是static一个类的成员一样。C++11 中的常规枚举可以选择添加前缀,但强类型枚举需要它。

C++11 本质上为枚举添加了三个新特性:

  • 显式输入 ( enum class EnumName : int)
  • 词法作用域(EnumName::语法)
  • 强类型。

您可以使用常规枚举获得前两个(向后兼容性使得它们对于非class枚举都是可选的)。但是获得强类型的唯一方法是 with enum class,这需要其他两者(如果您没有为enum class声明指定显式类型,我相信它使用int)。

强制范围意味着您通常不需要为enum classes 设置 ALL_CAPS 枚举器名称,因为无论如何您都必须明确地确定它们的范围。

于 2012-04-09T04:42:02.180 回答
1

我在使用 GCC 的 Code::Blocks 10.05 时遇到了同样的问题。

我要做的是转到项目 > 构建选项,在左侧窗格中选择我的项目名称(不是“调试”或“发布”)。然后,在选定的编译器“GNU GCC Compiler”下,在“Compiler Settings”、“Compiler Flags”下,勾选“Have g++ follow thecoming C++0x ISO C++ language standard [-std=c++0x]”。

于 2013-11-11T18:00:35.257 回答