2011-05-13 17 views
3

= /このラインテンプレートクラス:いいえデフォルトコンストラクタ私はこのことについて百万件の記事がある知っているが、これは動作していない理由を私はまだ把握することはできません

test = new Test2<Test>; 

ができます私にこのエラー:

error C2512: 'Test2<PARENT>' : no appropriate default constructor available 
with 
[ 
    PARENT=Test 
] 

コード:

template<class PARENT> 
class Test2; 

//////////////////////////// 

class Test 
{ 
public: 
    Test2<Test> *test; 

    Test() 
    { 
     test = new Test2<Test>; 
    } 
}; 

///////////////////////////// 

template<class PARENT> 
class Test2 
{ 
public: 
    PARENT *parent; 
}; 

//////////////////////////// 

誰かが私を助けることができますか?私にとって

答えて

6

(すなわちTestコンストラクタ内の)インスタンス化の時点で、全てのコンパイラがこれまでTest2<>前方宣言でいます。利用可能なコンストラクタはまだわかりません。

は解決する、のいずれかTestのその前Test2<>の定義を移動し、または(Test2<>の定義後)クラス定義の外側Testコンストラクタの定義を移動します。

+0

驚くばかりです。ありがとう。私はフォワード宣言の後、そのクラスのメンバーもすぐ後に利用できるという印象を受けました。 – bitwise

0

、あなたのコードは(正しく、私見)エラー与える:これはG ++ 4.5.1である

invalid use of incomplete type 'struct Test2<Test>' 

を。あなたが言う時点で:

test = new Test2<Test>; 

Test2は定義されていません、フォワードのみが宣言されています。

+0

私は、Test2のクラスを作成する前にエラーが '適切なデフォルトのコンストラクタが利用できません 'と思うので、Testのコンストラクタが必要です。私はworngです。コメントはありますか? – Mayank

-1

test = new Test2<Test>;は、Testのデフォルトコンストラクタ内で実行されています。 そして、この行はデフォルトのコンストラクタ/コンストラクタを引数なしで呼び出します。上記の文が呼び出されても、Testのコンストラクタはまだ完了していません。

+0

問題は 'Test'コンストラクタとは関係ありません。 –

+0

@Oli Charlesworth:コンパイラはどのようにしてTestについて知っていますか? – Mayank

+0

これは必要ありません。 'Test2 'は 'T *'メンバーしか持っていません。クラス定義は必要なく、宣言だけです。 –

関連する問題