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