8

这个问题上,有一个答案指出:

您可以使用 typedef 使 Color 枚举类型可访问,而无需指定它的“全名”。

typedef Sample::Colour Colour;
Colour c = Colour::BLUE;

这对我来说听起来是正确的,但有人否决了它并留下了这条评论:

在枚举上使用范围解析运算符 ::(如“Colour::BLUE”)是特定于编译器的扩展,而不是标准 C++

真的吗?我相信我在 MSVC 和 GCC 上都使用过它,尽管我不确定。

4

5 回答 5

8

我尝试了以下代码:

enum test
{
    t1, t2, t3
};

void main() 
{
    test t = test::t1;
}

Visual C++ 9 编译它时出现以下警告:

警告 C4482:使用了非标准扩展:限定名称中使用了枚举“测试”

看起来不是标准的。

于 2009-01-14T01:50:35.930 回答
8

那不是标准的。

在 C++11 中,您将能够使用枚举类声明创建范围枚举。

对于 C++11 之前的编译器,要确定枚举的范围,您需要在结构或命名空间内定义枚举。

于 2009-01-14T02:40:36.937 回答
4

在标准 c++ 中,“::”左边的东西必须是类或命名空间,枚举不计算在内。

于 2009-01-14T01:49:37.120 回答
4

这在 C++98 中是不允许的。但是,从 C++11 开始,您可以选择将范围解析运算符与“旧式”枚举一起使用

enum E { A };

int main()
{
  A;    // OK
  E::A; // Also OK
}

A在 C++11 及更高版本中,两种引用方式都是正确的。

于 2019-02-28T17:25:11.373 回答
0

您可以做的就是创建一个与枚举同名的命名空间。这将有效地将枚举值添加到它们自己的范围中,您可以使用枚举/命名空间的名称来引用它们。当然,它仅适用于否则将存在于全局(或另一个命名空间)范围内的枚举。

还有一篇关于这个问题的文章。

于 2009-01-14T01:52:25.053 回答