C ++使用命名空间语句

时间:2011-10-09 06:50:31

标签: c++ namespaces

namespace MyNamespace
{
    static void foo1()
    {

    }
}

using namespace MyNamespace;

class MyClass
{
    void foo2()
    {
        ::foo1();
    }    
};

范围解析操作::表示在全局命名空间中使用方法。在这里,我们可以使用::foo1()。这意味着方法foo1()在全局命名空间中,我是对的吗?

我的问题是,using namespace ANAMESPACE_NAME是否意味着我们将命名空间ANAMESPACE_NAME中的所有元素导入全局命名空间?

4 个答案:

答案 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)