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,
};