2010-02-05 47 views
1

我有一個使用命名空間的代碼,他們幾個,我有我的大腦有些混亂。NameSpaces何時,何地,爲什麼!

如果我有這樣的:

#include <vector> 

protected: 
    vector<registeredObject> mRegistryList; 

編譯器抱怨向量有 '無型'

不能我只是這樣做:

#include <vector> 

protected: 
    std::vector<registeredObject> mRegistryList; 

或者我需要要做:

using namespace std; 
#include <vector> 

protected: 
    std::vector<registeredObject> mRegistryList; 

使用多個名稱空間等的正確方法是什麼?

+0

相關:http://stackoverflow.com/questions/1452721/ – 2010-02-05 04:47:42

回答

1

的第二兩種可能性要麼將工作。如果你關心,還有一個第三名:

using std::vector; 

protected: 
    vector<registeredObject> mRegistryList; 

其中,using namespace std;一般建議反對 - 它拖了大量的名字,其中一些你基本上可以甚至不知道的,所以它很容易與您自己的代碼中的各種事物相沖突。大多數人使用明確的限定名稱,例如:大多數時候使用std::vector...版本。

3

我假定上面的代碼是一個類的內部。在那種情況下,你想要#2。事實上,你應該避免#3頭,這當然是其中的類定義裏面居住。否則,當你使用#include這個頭文件時,你將非常不滿所產生的命名空間衝突。

1

編譯器抱怨向量有 「無型」

那是因爲沒有在全局命名空間稱爲vector類。而且,由於在定義向量編譯器無法找到該類時,您尚未指定任何名稱空間。

你的第二個選項是好的。在那裏你告訴編譯器vecror類位於std命名空間中。

在第三個選項std::中定義的mRegistryList是不必要的,因爲您已經通過using std;聲明包含了命名空間。我覺得using語句會污染命名空間(特別是在頭文件中使用時),所以我更喜歡第二種選擇。

1

首先,不要將using namespace置於頭文件中,否則包含該頭文件的所有文件都將具有全局名稱空間中導入的給定名稱空間中的所有類型。這會造成很多混亂。

第二件事,在你的最後一個例子中,你在#include之前寫了using namespace,而不是全部包括在內。

第三件事,如果你寫using namespace std;你不需要完全限定你的std::vector並且可以使用vector

最後,我的偏好是:

  1. 在頭文件中,總是使用完全合格的命名空間。
  2. 在源文件中,如果僅使用std名稱空間中的一種或兩種類型,則可以使用using std::vector;而不是使用完整名稱空間。
  3. 在源文件中,您使用std命名空間中的很多類型,請與using namespace std;聯繫。
0

使用聲明或在使用時顯式指定名稱空間將允許您使用它。我相信你遇到的問題是「受保護的」聲明。像「protected」這樣的訪問說明符只用於類的上下文中。

至於哪一種最好用,使用全局「using」聲明一般是不明智的,因爲你不需要在「std」命名空間中的所有東西,它會打敗擁有首先是一個單獨的命名空間,即減少名稱衝突的機會。有時,對於將從名稱空間使用的對象(比如「using std :: vector;」),使用聲明可以使單個聲明成爲單箇中間聲明。這不會拖累所有std對象,只是那個特定的對象。但是,即使在這種情況下,如果代碼中的任何內容被稱爲「矢量」,則可能會導致碰撞。通常最好使用明確的規格。

1

使用指令的格式爲using namespace some_name;,指南是不應該在函數範圍之外使用它們。在函數作用域中使用它們(即使在頭文件中定義了該函數時,例如內聯或模板)總是很好。

使用聲明的格式爲using something::something;,指南是不應該在全局範圍的標題中使用它們。在你自己的命名空間,類定義或函數範圍中使用它們總是很好。

如果您遵循這些準則,您將永遠不會有意外的名稱歧義問題,並且不會寫入包含其他代碼的頭文件。

相關問題