C++ 引用封闭命名空间

C++ 引用封闭命名空间,c++,namespaces,C++,Namespaces,这是不可编译的 namespace n1 { enum e1_tag { FOO1 = 0, } e1; namespace n2 { enum e2_tag { BAR1 = 3 + n1::e1::FOO1 // Why doesn't this compile? } e2; } } g++抱怨n1::e1不是类或命名空间。消除n1会产生与消除e1相同

这是不可编译的

namespace n1
{
    enum e1_tag
    {
        FOO1 = 0,
    } e1;

    namespace n2
    {
        enum e2_tag
        {
            BAR1 = 3 + n1::e1::FOO1  // Why doesn't this compile?
        } e2;
    }
}
g++抱怨n1::e1不是类或命名空间。消除n1会产生与消除e1相同的错误


我缺少什么?

e1
不是类或命名空间。它是一个变量,类型为
e1\u tag

枚举数的作用域在周围的名称空间中,因此您需要
n1::FOO1
。请注意,枚举数包含字母
O
,而不是数字
0

从C++11开始,可以使用作用域枚举


创建包含其枚举数的作用域。现在,
n1::e1::FOO1
是正确的限定名。

枚举类型进入封闭名称空间的范围。枚举不会引入新的作用域。另外,
e1
是枚举的一个实例,而不是类型。

您有一个打字错误
F001
,而不是
FOO1
,反之亦然,n1::F001。e1是枚举,不是结构或类。谢谢!输入错误(现已修复)隐藏了n1::FOO1的正确性。我想我的编辑需要一个更好的字体。
enum class e1 {
    FOO1 = 0,
};