【问题标题】:Resolving ambiguity with using declaration使用声明解决歧义
【发布时间】:2017-07-03 22:05:55
【问题描述】:

看看这个sn-p:

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(); 处不明确

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

【问题讨论】:

  • z = A::fn(); 在你的情况下,对吧?
  • @George 该评论毫无意义。 OP 在全局命名空间中没有或不想要任何功能。

标签: c++


【解决方案1】:

参见 [namespace.udir]/2

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

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

【讨论】:

  • 确实,这也是全局命名空间不特殊的原因(对于 OP 来说是明确的):您可以通过在整个文件周围放置 namespace Foo { ... } 来查看这一点,使 AB 嵌套命名空间。行为不会改变。
  • 谢谢布赖恩!这种行为背后的原因是什么?这对我来说似乎有点奇怪。它恰好解决了我的情况,我可以选择fn() 获胜。会不会是这个原因?
  • @geza 我不知道原因。如果您问另一个问题,那么我敢打赌有人会知道答案
  • 我稍微考虑了一下。乍一看,using namespace 应该从命名空间“导入”所有东西,就好像所有东西都在声明中使用一样。但这可能是个坏主意,因为这样我就无法在我的命名空间中添加任何与“导入”命名空间中的任何东西同名的东西。这可能是原因,但谁知道:)
猜你喜欢
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
相关资源
最近更新 更多