2015-02-10 64 views
1

这不会编译。引用包含命名空间

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一样。

我错过了什么?

+0

你有一个错字'F001'而不是'FOO1'或反之亦然 – 2015-02-10 16:44:39

+0

这应该是,n1 :: F001。 e1是一个枚举而不是结构体或类。 – Matt 2015-02-10 18:46:17

回答

2

e1不是类或名称空间。这是一个变量,类型为e1_tag

这些枚举数的范围在周围的命名空间,所以你想要n1::FOO1。请注意,枚举器包含字母O,而不是数字0

由于C++ 11,你可以使用一个范围的列举

enum class e1 { 
    FOO1 = 0, 
}; 

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

+0

谢谢!错字(现在是固定的)隐藏了n1 :: FOO1的正确性。猜猜我的编辑器需要更好的字体。 – BigEndian 2015-02-10 16:54:39

0

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