C++枚举类型中,枚举的名称全数暴露于一般范围中,因此两个不同的枚举,不可以有相同的枚举名。例如:
enum Side{ Right, Left };
enum Thing{ Wrong, Right };
在编译时会产生编译错误,不能一起使用。
C++11 引进了一种特别的"枚举类",可以避免上述的问题。参见我的上一篇博客《C++11》。
但是在VC2012中尚不支持该特性。幸运的是,我们可以通过多写几行代码“曲线”实现一个“枚举名称可重名”的枚举类型。废话少话,奉上代码:
namespace _EnumRecordType
{
enum E
{
recTypeIris,
recTypeFace,
};
}
typedef _EnumRecordType::E EnumRecordType;
使用时可以像下面这样使用:
EnumRecordType type = EnumRecordType::recTypeIris;
这样实现在VC2012下可以顺利编译,但在VC2010上则会产生C4482的警告:
warning C4482: nonstandardextension used: enum '_EnumRecordType::Enum' used in qualified name
可以在namespace声明的前面加入如下代码,以去掉警告:
#if defined(_MSC_VER)&& _MSC_VER < 1700
#pragma warning(disable: 4482)
#endif