namespace MyNamespace
{
static void foo1()
{
}
}
using namespace MyNamespace;
class MyClass
{
void foo2()
{
::foo1();
}
};
范围解析操作::
表示在全局命名空间中使用方法。在这里,我们可以使用::foo1()
。这意味着方法foo1()
在全局命名空间中,我是对的吗?
我的问题是,using namespace ANAMESPACE_NAME
是否意味着我们将命名空间ANAMESPACE_NAME
中的所有元素导入全局命名空间?
答案 0 :(得分:5)
没有。 “使用命名空间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.
答案 1 :(得分:3)
这里我们可以使用:: foo1()。这意味着方法foo1()在全局命名空间中,我是对的吗?
是的,这是正确的。这意味着调用全局命名空间中定义的名为foo1()
的方法。
这称为限定名称空间查找。
执行“使用命名空间ANAMESPACE_NAME”是否意味着我们将ANAMESPACE_NAME命名空间中的所有元素导入全局命名空间?
是的,它将ANAMESPACE_NAME
命名空间中的所有元素导入当前命名空间
它被称为使用指令
如果您只想导入当前类型使用的特定元素,使用声明。
格式为:
使用ANAMESPACE_NAME :: element_name;
答案 2 :(得分:3)
C ++ 2003标准的3.4.3.4节有一个答案:
查找以一元范围运算符::(5.1)为前缀的名称 全局范围,在使用它的翻译单元中。名字应该 在全局命名空间范围中声明,或者是一个名称 由于使用指令,声明在全局范围内可见 (3.4.3.2)。
这段在C ++ 11 FDIS中几乎完全相同,所以这可能也适用于C ++ 11。
答案 3 :(得分:0)