c++中的命名空间搜索

namespace search in c++

本文关键字:搜索 命名空间 c++      更新时间:2023-10-16

我发现了一个与命名空间搜索有关的问题。以下简化代码编译失败:

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)。

编译器是对的吗?

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