如何正确使用C ++强类型枚举?

时间:2012-04-09 04:35:51

标签: c++ enums c++11

我想使用带有默认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;
}

2 个答案:

答案 0 :(得分:4)

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

C ++ 11基本上为枚举添加了三个新功能:

  • 明确输入(enum class EnumName : int
  • 词法范围(EnumName::语法)
  • 强力打字。

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

强制作用域意味着您通常不需要enum class es的ALL_CAPS枚举器名称,因为您无论如何都必须明确指定它们。

答案 1 :(得分:1)

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

我要做的是去Project>构建选项,在左窗格中选择我的项目名称(不是“调试”或“发布”)。然后,在选定的编译器“GNU GCC Compiler”下,在“Compiler Settings”,“Compiler Flags”下,我检查了“让g ++遵循即将推出的C ++ 0x ISO C ++语言标准[-std = c ++ 0x]”。