不同的枚举,相同的价值

Jor*_*nsM 2 c++ enumeration

是否可以制作两个具有相同值的不同枚举?例如,

enum direction{
    LEFT,
    RIGHT,
    UP,
    DOWN,
    NONE
}
enum color{
   RED,
   GREEN,
   BLUE,
   NONE
}
Run Code Online (Sandbox Code Playgroud)

编译器会说有两个'NONE'声明.有没有解决的办法?

Sam*_*all 9

有几种方法可以解决这个问题.一种方法是使用命名空间来包装枚举并防止值污染全局命名空间:

namespace direction {
    enum direction {
        LEFT,
        RIGHT,
        UP,
        DOWN,
        NONE
    };
}
namespace color {
    enum color {
       RED,
       GREEN,
       BLUE,
       NONE
    };
}
Run Code Online (Sandbox Code Playgroud)

您也可以使用新的C++ 11方式(如果您的编译器支持它)并使用"强类型枚举"

enum class direction {
    LEFT,
    RIGHT,
    UP,
    DOWN,
    NONE
};
enum class color {
   RED,
   GREEN,
   BLUE,
   NONE
};
Run Code Online (Sandbox Code Playgroud)

两者都可以通过语法使用direction::NONEcolor::NONE但有一个重要区别.在第一种情况下,枚举仍然会隐式地转换为整数.这意味着你可以写

int foo = direction::NONE;

一切都很好.

在第二种情况下,这将是编译器错误,因为foo与方向的类型不同.你可以通过这样做来解决这个问题

direction foo = direction::NONE;

哪些可能适用于您,也可能不适合您.如果需要将其强制转换为int,欢迎使用它static_cast<int>(foo)来获取整数类型.