引用封闭命名空间

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 是枚举的实例,而不是类型。