你可以使用typedef将颜色枚举类型定义为可访问的,而无需指定它的“完整名称”。
typedef Sample::Colour Colour; Colour c = Colour::BLUE;
在我看来,这听起来是正确的,但有人已向下投票并留下了此评论:
在枚举类型中使用范围解析运算符::(例如“Colour::BLUE”)是特定于编译器的扩展,而不是标准C ++。
那是真的吗?我相信我已经在MSVC和GCC上都使用过了,虽然我不确定。
我尝试了以下代码:
enum test
{
t1, t2, t3
};
void main()
{
test t = test::t1;
}
Visual C++ 9编译时出现以下警告:
warning C4482: nonstandard extension used: enum test used in qualified name
看起来并不像是标准的。
那不是标准的。
在C++11中,您将能够使用enum class声明创建具有作用域的枚举。
在C++11之前的编译器中,如果想要给枚举加作用域限定符,需要在结构体或命名空间中定义枚举。
C++98 中不允许这样做。但是,从 C++11 开始,您可以可选地在“旧风格”枚举中使用作用域解析运算符。
enum E { A };
int main()
{
A; // OK
E::A; // Also OK
}
在C++11及其后版本中,对于A
的两种引用方式都是正确的。
在标准C++中,"::" 左边的东西必须是类或命名空间,枚举不算。
你可以创建一个与枚举同名的命名空间,以避免这种情况。这将有效地将枚举值添加到它们自己的范围中,并且你可以使用枚举/命名空间的名称来引用它们。当然,这仅适用于本应存在于全局(或其他命名空间)范围内的枚举。
这个问题还有一篇文章在某处。