我发现有关命名空间搜索的问题。 以下简化代码无法编译:
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)。
编译器是对的吗?
答案 0 :(得分:5)
B
中的typdef B::Test
解析为A::C::B
。如果您要重用名称B
,则需要指定它以消除歧义。编译器表现正常。 IIRC,名称解析为最接近其使用或参考的声明。在这种情况下,A::C::B
是与typedef
最接近的声明。