我想使用带有默认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;
}
答案 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]”。