【问题标题】:Prefer one of multiple declarations with same name首选具有相同名称的多个声明之一
【发布时间】:2016-05-27 18:55:25
【问题描述】:

假设我有以下代码

namespace A {
    int foo();
}
namespace B {
    void foo();
}
using namespace A;
using namespace B;


int x = foo(); // error

我发现A::foo 真的很有用,但不是B::foo。我能做些什么来使A::foo 在随后对foo 的不合格引用中成为首选?例如。 using A::foo(实际上没有效果),或unusing B::foo

【问题讨论】:

  • 你有命名空间 A 和 B 并且你想要更喜欢 A::foo 然后你要做的是删除两个 using namespace 语句,然后在你想要更喜欢 A::foo 的函数中使用using A::foo,然后调用foo()会导致A的foo函数
  • 这不是一个好的答案——请参阅下面的 SergeyA 的答案——所以这是一个评论。您可以(并且应该)显式声明命名空间:int x = A::foo(); 这完全消除了对 using namespace 的需要。

标签: c++ namespaces shadowing


【解决方案1】:

拥有命名空间的全部意义在于隔离名称。通过using 整个命名空间,你就无视这个理由。

解决您的问题的方法是一劳永逸地停止using namespace,并且永远不要回到这种可悲的策略。

【讨论】:

  • 或者在有限的范围内进行,即int main() { using namespace A; ... }
  • @sleeptightpupper,我还没有看到使用整个命名空间的任何理由,即使在足够窄的范围内也是如此。
  • 但是在有限的范围内聪明地做。 int main() { using namespace A; using namespace A; int x = foo(); } 让 OP 没有好转。在你知道自己在做什么并且可以证明using namespace <insert namespace here> 之前,不要这样做。
  • @SergeyA,std::literals::chrono_literals 怎么样?您不必使用using 指令来使它们可见吗?
  • @AidenDeom,很公平,这是一个原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
相关资源
最近更新 更多