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

How to correctly use C++ strongly typed enumerations?

本文关键字:强类型 枚举 C++ 何正确      更新时间:2023-10-16

我想将 C++11 作用域枚举与默认的 int 实现一起使用:

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

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

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

  • 显式键入 ( enum class EnumName : int
  • 词法范围(EnumName::语法)
  • 强类型。

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

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

我在使用

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

我要做的就是转到项目>生成选项,在左窗格中选择我的项目名称(不是"调试"或"发布")。 然后,在选定的编译器"GNU GCC 编译器"下,在"编译器设置"、"编译器标志"下,我选中了"让 g++ 遵循即将到来的 C++0x ISO C++ 语言标准 [-std=c++0x]。