【问题标题】:Confusion About C++ Global Namespace关于 C++ 全局命名空间的困惑
【发布时间】:2013-08-11 21:37:40
【问题描述】:

根据我的理解,将:: 附加到命名空间的前面是指全局命名空间,而不管任何 using 语句或父命名空间。如果是这样,而且我没有误解任何东西,那么为什么这样的代码会编译(至少在 Visual Studio 中):

namespace Foo {
    namespace Bar {
        class X;
    }
}

using namespace Foo;
int main(void)
{
    ::Bar::X x;
}

【问题讨论】:

  • 因为 using 指令会导入所有内容。

标签: c++ namespaces scope


【解决方案1】:

using namespace Foo;namespace Foo 的所有内容带入当前命名空间的上下文中。

由于namespace Barnamespace Foo的内容之一,并且与using语句所在行的当前命名空间是全局命名空间,所以namespace Bar被带入全局命名空间的上下文中。

【讨论】:

  • 啊,好的,谢谢。我以为这就是正在发生的事情,但我只是想确定一下。我真的希望 :: 覆盖 using 语句,但我想我们并不总是得到我们想要的:/
  • @Duncan :: 在语句开头将引用全局命名空间上的范围解析,而不管您引入了什么 using 语句。您希望它“[覆盖] using statements”是什么意思?
  • @Duncan 只是为了明确namespace K { using namespace Foo; }namespace Foo 的内容放在K:: 下,这就是这里发生的一切,除了隐含全局命名空间:: 的事实。
  • 举个例子,如果我用using namespace Foo::Bar 代替。然后,如果有人在他们的代码中引用了::X,那么就没有简单的方法可以知道这是对Foo::Bar::X 的引用,还是在命名空间之外的其他地方定义了一个类X。在这一点上,我真的只是在吹毛求疵。
  • @Duncan 但这是您总会遇到的问题。请记住,您始终可以使用类型的完全限定路径:::Foo::Bar::X - 即使您有 using namespace Foo::Bar; 语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 2021-05-08
  • 2011-12-14
  • 2011-07-17
  • 2010-09-29
相关资源
最近更新 更多