命名空间在c ++中搜索

时间:2012-02-02 14:50:49

标签: c++ namespaces

我发现有关命名空间搜索的问题。 以下简化代码无法编译:

namespace A {
  namespace B { 
    class Test {
    };
  }
  namespace C {
    namespace B {
      typedef B::Test AnAlias;
    }
  }
}

编译器抱怨名称空间A::C::B中的Test没有命名类型。

问题似乎是编译器在命名空间C中看到了命名空间B,并且没有进一步搜索。我本来希望他也会查看名称空间A(这是一个封闭的名称空间)并在那里找到B :: Test。

如果我重命名C::B一切都很好 如果我有资格A::B::Test,一切都很好 如果我将typedef直接放在命名空间A::C中,一切都很好。

使用gcc 4.1和intel 12编译器测试了此行为。 (均为linux)。

编译器是对的吗?

1 个答案:

答案 0 :(得分:5)

B中的typdef B::Test解析为A::C::B。如果您要重用名称B,则需要指定它以消除歧义。编译器表现正常。 IIRC,名称解析为最接近其使用或参考的声明。在这种情况下,A::C::B是与typedef最接近的声明。