C++中的枚举 enum
使用如果没有对应的范围限定,会很容易出现重定义的错误。
如下的重定义错误,在一个文件中有如下两个枚举,编译时会出现重定义错误
enum Type
{
MIN_TYPE,
MAX_TYPE,
INPUT_TYPE
};
enum Mode
{
CITY,
INPUT_TYPE
};
此时虽然是不同的枚举类型,但是 Type::INPUT_TYPE
和 Mode::INPUT_TYPE
由于是相同的枚举值,会出现如下的报错: “INPUT_TYPE”: 重定义;
因此需要为该枚举加上命名空间或者枚举类来解决 不同枚举类型的相同枚举值导致的重定义问题。
1. 枚举加上命名空间
// 如果有相同的枚举值,需要将其放在不同的命名空间中
namespace MySpaceA
{
enum Type
{
MIN_TYPE,
MAX_TYPE,
INPUT_TYPE
};
}
namespace MySpaceB
{
enum Mode
{
CITY,
INPUT_TYPE
};
}
// 在函数中使用是通过 命名空间::枚举名::枚举值
MySpaceA::Type::INPUT_TYPE;
MySpaceB::Mode::INPUT_TYPE;
该方式使用枚举值可以自动隐式将其转换成 int 类型
2. 枚举类 enum class
的方式
枚举类是 C++11 所提供的方法
// 如果有相同的枚举值,可以使用枚举类来处理
enum class Type
{
MIN_TYPE,
MAX_TYPE,
INPUT_TYPE
};
enum class Mode
{
CITY,
INPUT_TYPE
};
// 在函数中使用是通过 枚举名::枚举值
Type::INPUT_TYPE;
Mode::INPUT_TYPE;
枚举类的方式无法隐式自动将枚举值转换成 int 类型,需要显式的进行转换(int)Type::INPUT_TYPE