引用封闭的命名空间

时间:2015-02-10 16:40:53

标签: 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一样。

我错过了什么?

2 个答案:

答案 0 :(得分:2)

e1不是类或命名空间。它是e1_tag类型的变量。

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

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

enum class e1 {
    FOO1 = 0,
};

创建包含其枚举数的范围。现在n1::e1::FOO1是正确的限定名称。

答案 1 :(得分:0)

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