使用声明解决歧义

时间:2017-07-03 22:05:55

标签: c++

请看这个片段:

namespace A {
int fn();
}
namespace B {
int fn();
}

// namespace Ns {

using namespace A;
using namespace B;
using A::fn;

int z = fn();

// }

此代码无法编译,fn()

int z = fn();不明确

如果我将using&{39}和z放入命名空间(删除两个//),代码就会编译。这是为什么?全局命名空间有什么特别之处?

1 个答案:

答案 0 :(得分:8)

见[namespace.udir] / 2

  

using-directive 指定指定命名空间中的名称可以在范围内使用    using-directive 出现在 using-directive 之后。在非限定名称查找(3.4.1)期间,将显示名称   好像它们是在最近的封闭命名空间中声明的,它包含 using-directive 和   提名命名空间。

因此,当您拥有名称空间Ns时,指令using namespace A;using namespace B会使A::fnB::fn出现在全局名称空间中,而{{{ 1}}使using A::fn;出现在fn中。后一个声明在名称查找期间“胜出”。