引用封闭命名空间
Referencing enclosing namespace
这不编译。
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 不是 class 或命名空间。消除 n1 产生相同的错误,消除 e1.
我错过了什么?
e1
不是 class 或命名空间。这是一个变量,类型为 e1_tag
.
枚举数在周围的命名空间范围内,因此您需要 n1::FOO1
。请注意,枚举数包含字母 O
,而不是数字 0
.
自 C++11 起,您可以使用 范围枚举
enum class e1 {
FOO1 = 0,
};
创建一个包含其枚举器的范围。现在 n1::e1::FOO1
是正确的限定名称。
枚举类型进入封闭命名空间的范围。枚举不会引入新的范围。另外 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 不是 class 或命名空间。消除 n1 产生相同的错误,消除 e1.
我错过了什么?
e1
不是 class 或命名空间。这是一个变量,类型为 e1_tag
.
枚举数在周围的命名空间范围内,因此您需要 n1::FOO1
。请注意,枚举数包含字母 O
,而不是数字 0
.
自 C++11 起,您可以使用 范围枚举
enum class e1 {
FOO1 = 0,
};
创建一个包含其枚举器的范围。现在 n1::e1::FOO1
是正确的限定名称。
枚举类型进入封闭命名空间的范围。枚举不会引入新的范围。另外 e1
是枚举的实例,而不是类型。