C++ 关于C+的困惑+;全局命名空间

C++ 关于C+的困惑+;全局命名空间,c++,namespaces,scope,C++,Namespaces,Scope,根据我的理解,在名称空间的前面追加:是指全局名称空间,而不考虑任何using语句或父名称空间。如果是这样的话,而且我没有误解任何东西,那么为什么要编译这样的代码(至少在Visual Studio中): 使用名称空间Foo将名称空间Foo的所有内容放入当前名称空间的上下文中 由于namespace Bar是namespace Foo的内容之一,并且使用using语句行上的当前名称空间是全局名称空间,namespace Bar被带到全局名称空间的上下文中。因为using指令导入所有内容。啊,好的,谢

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


使用名称空间Foo
名称空间Foo
的所有内容放入当前名称空间的上下文中


由于
namespace Bar
namespace Foo
的内容之一,并且使用
using
语句行上的当前名称空间是全局名称空间,
namespace Bar
被带到全局名称空间的上下文中。

因为using指令导入所有内容。啊,好的,谢谢。我以为事情就是这样,但我只是想确定一下。我真的希望
使用语句重写,但我想我们并不总是得到我们想要的:/@Duncan
在语句的开头,将引用全局命名空间上的范围解析,而不管您使用了什么
语句。你想让它“[override]using statements”是什么意思?@Duncan只是想澄清一下
namespace K{using namespace Foo;}
namespace Foo的内容放在
K:::
下,这就是这里发生的一切,除了全局名称空间
是隐含的这一事实之外。例如,如果我使用名称空间Foo::Bar
放置
。然后,如果有人在他们的代码中引用了
::X
,那么很难知道这是对
Foo::Bar::X的引用,还是在命名空间之外定义了类
X
。“在这一点上我真的只是吹毛求疵,”邓肯说,“但这是你经常遇到的问题。”。请记住,您始终可以使用类型的完全限定路径:
::Foo::Bar::X
——即使您有一个使用命名空间Foo::Bar的
语句。
namespace Foo {
    namespace Bar {
        class X;
    }
}

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