引用封闭命名空间

Referencing enclosing namespace

本文关键字:命名空间 引用      更新时间:2023-10-16

这不会编译。

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_tag的变量。

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

从C++11开始,您可以使用范围的枚举

enum class e1 {
    FOO1 = 0,
};

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

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