如何正确使用C++强类型枚举
How to correctly use C++ strongly typed enumerations?
我想将 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]。
相关文章:
- 在编译时将强类型枚举器转换为其基础类型?
- 如果 int 是"not within the enums range",为什么将 int 转换为强类型枚举会编译?
- 强类型枚举的语法实现错误
- 枚举与强类型枚举
- 错误:T没有命名类型-用于使用强类型枚举的专门化
- 如何使用强类型枚举
- QT:将强类型枚举参数传递到插槽
- Visual Studio 11 (beta) 中的强类型枚举类
- 使用强类型枚举对类型和子类型进行建模
- 不允许将强类型枚举用作同一基础类型的参数
- 如何正确使用C++强类型枚举
- 带有强类型枚举的模板参数推导
- C++中默认初始化的全局强类型枚举是什么
- std::is_signed不适用于强类型枚举:int
- 将强类型枚举传递给函数
- 如何自动将强类型枚举转换为整型
- 为什么不能通过指针将 C++11 强类型枚举强制转换为基础类型?
- 关于强类型枚举前向声明
- 在成员函数的默认参数中使用强类型枚举的成员
- 没有显式作用域的强类型枚举