2012-01-06 5 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に:(。テキスト+ 0x10を):未定義の `A :: C :: C() 'への参照。私はそれが何とか間違っているコンストラクタのC :: C()定義だと思いますが、それを修正する方法は不明です。

+1

あなたの定義は間違っています... –

+1

名前の競合にぶつかっているので、これをやったと仮定します。 –

答えて

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

これを行うには非常に奇妙なことです。

これは、ヘッダに宣言されたすべてをAという名前空間に配置します。具体的には、A::Cの宣言があります。これは、周囲の名前空間を持たないヘッダーを含めると、::Cとは異なるクラスです。

::C::C()の定義を提供しました。 main.cppにはA::C::C()の定義が必要です。それはそれが使用するクラスなのでです。それはどこにも定義されていないので、エラーです。

どちらかが(とその名前空間を使用するようにC.cppを修正)ヘッダファイルに名前空間を移動することでnamespace Aに適切Cを置く、またはnamespace Aを取り除きます。

4

は、あなたも、名前空間ACのコンストラクタを定義する必要があります。

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

したがって、クラスがどのネームスペースに属しているかを決める必要があります。ネームスペースA {クラスとそのメンバーがヘッダ内に完全に定義されていない限り、私はそれを推奨していませんがクラスの作成者が選択した名前空間が嫌いな場合は、 'namespace A {typedef HorridNamespace :: CC;}'または '名前空間A {HorridNamespace :: C;}を使用しています。 –

+0

私はヘッダ内にクラス全体を定義するか、名前空間の外にそれを含める必要がありますか?名前空間の外側で使用しますか? – user1134621

+0

@Steve:または単純に '名前空間A = HorridNamespace'です。 –

関連する問題