2012-01-06 16 views
1

我有一個名稱空間,我想在其中定義一個類。該類相當複雜,所以我寧願將它定義在單獨的頭文件中,但即使是最簡單的代碼也會給我一個「未定義的引用」錯誤。如何使用名稱空間內單獨標題中定義的類

的main.cpp

#include <iostream> 
namespace A { 
    #include "C.hpp" 
} 

int main() 
{ 
    A::C foo; 
    std::cout << foo.member << std::endl; 
    return 0; 
} 

C.hpp

class C { 
    public: 
    C(); 
    int member; 
} 

C.cpp

C::C() 
{ 
    this->member = 10; 
} 

當我運行g++ C.cpp main.cpp我得到「的main.cpp :(。文字+ 0×10 ):未定義對`A :: C :: C()'的引用錯誤。我想這是構造函數的C :: C()定義,但是我不確定如何修復它。

+1

那麼你的定義是錯誤的... – 2012-01-06 16:10:23

+1

我會假設你已經這樣做了,因爲你正在運行命名衝突。在這一點上,我只是想說,「我希望你在創建類時忽略了關於忽略命名空間的教訓。」 – 2012-01-06 19:23:28

回答

0
namespace A { 
    #include "C.hpp" 
} 

這是一件非常奇怪的事情。

這將所有聲明在標題中的內容放在一個名爲A的名稱空間中;具體而言,它會爲您提供A::C的聲明,這與您在包含沒有周圍名稱空間的標頭時獲得的::C類別不同。

您已經爲::C::C()提供了定義;但main.cpp需要定義A::C::C(),因爲這是它使用的類。這不是在任何地方定義的,因此錯誤。

要麼把C正常進入namespace A通過移動命名空間的頭文件(和修復C.cpp使用該命名空間),或擺脫namespace A

4

你必須定義內命名空間AC的構造:

namespace A 
{ 
    C::C() 
    { 
     this->member = 10; 
    } 
} 
+4

因此,你必須先決定該類屬於哪個命名空間。沒有'namespace A { #include「C.hpp」}'來自一個用戶,'namespace B {#include「C.hpp」}'來自另一個用戶。除非類和它的成員完全在頭文件中定義,儘管我並不建議,因爲兩個用戶最終會碰到兩個碰巧具有相同定義的不同類,如果用戶不喜歡該類作者選擇的命名空間,他們可以寫'namespace A {typedef HorridNamespace :: CC;}'或' namespace A {using HorridNamespace :: C;}'。 – 2012-01-06 16:11:19

+0

我明白了,所以我要麼必須在頭文件中定義整個類,要麼將它包含在名稱空間之外?如果類不會很多,在命名空間之外使用? – user1134621 2012-01-06 16:31:44

+0

@Steve:或只需'命名空間A = HorridNamespace'。 – 2012-01-06 16:32:31

相關問題