2011-10-09 105 views
6
namespace MyNamespace 
{ 
    static void foo1() 
    { 

    } 
} 

using namespace MyNamespace; 

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

範圍解析操作::表示使用全局名稱空間中的方法。在這裏我們可以使用::foo1()。這意味着方法foo1()在全局命名空間中,我是對嗎?使用名稱空間語句的C++

我的問題是,using namespace ANAMESPACE_NAME是否意味着我們將名稱空間ANAMESPACE_NAME中的所有元素導入到全局命名空間中?

回答

3

科C++ 2003標準的3.4.3.4有一個答案:

由一元範圍操作符::(5.1前綴的名稱)在 全球範圍內,在使用它的翻譯單元中查找。在全局命名空間範圍中聲明名稱爲 ,或者由於使用指令 (3.4.3.2)而聲明的名稱在全局範圍內可見,因此名稱爲 。

本段在C++ 11 FDIS中幾乎完全相同,所以這可能也適用於C++ 11。

3

這裏我們可以使用:: foo1()。這意味着方法foo1()在全局命名空間中,對嗎?

是的,這是正確的。這意味着調用在全局命名空間中定義的名爲foo1()的方法。 這稱爲限定名稱空間查找

「使用名稱空間ANAMESPACE_NAME」是否意味着我們將ANAMESPACE_NAME名稱空間中的所有元素導入到全局名稱空間中?

是的,它會將ANAMESPACE_NAME命名空間中的所有元素導入到當前名稱空間中。
它被稱爲使用指令
如果您只想導入當前類型使用中的特定元素,則使用,使用聲明

格式是:

使用ANAMESPACE_NAME :: ELEMENT_NAME;

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. 
+0

+1:using指令並不總是必須在全球範圍內。 –

+0

+1:和上面一樣。 –