[英]C++ using namespace statement
namespace MyNamespace
{
static void foo1()
{
}
}
using namespace MyNamespace;
class MyClass
{
void foo2()
{
::foo1();
}
};
范围解析操作::
表示在全局命名空间中使用方法。 在这里我们可以使用::foo1()
。 这意味着方法foo1()
在全局命名空间中,对吗?
我的问题是,是否using namespace ANAMESPACE_NAME
意味着我们进口的所有元素形成的命名空间ANAMESPACE_NAME
到全局命名空间?
不,“使用命名空间ANAMESPACE_NAME”意味着我们将所有元素导入当前范围。
你可以写这样的东西:
namespace A {
int i = 10, j = 20;
}
int f()
{
using namespace A; // injects names from A into the global scope.
return i * j; // uses i and j from namespace A.
}
int k = i * j; // Error: undefined variant i and j.
在这里我们可以使用:: foo1()。 这意味着方法foo1()在全局命名空间中,对吗?
对,那是正确的。 这意味着调用全局命名空间中定义的名为foo1()
的方法。 这称为合格命名空间查找 。
“使用命名空间ANAMESPACE_NAME”意味着我们将ANAMESPACE_NAME命名空间中的所有元素导入全局命名空间?
是的,它将ANAMESPACE_NAME
命名空间中的所有元素导入到当前命名空间。
它被称为using指令 。
如果要导入当前类型的特定元素,请使用声明 。
格式是:
使用ANAMESPACE_NAME :: element_name;
C ++ 2003标准的3.4.3.4节有一个答案:
在全局范围内,在使用它的转换单元中查找以一元范围运算符::(5.1)为前缀的名称。 该名称应在全局命名空间范围内声明, 或者是一个名称,其声明在全局范围内可见,因为using-directive (3.4.3.2)。
这段在C ++ 11 FDIS中几乎完全相同,所以这可能也适用于C ++ 11。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.