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;
}