2011-05-13 94 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<>定義,或移動Test構造的定義中的類定義外部(和Test2<>定義之後)。

+0

太棒了。謝謝。我的印象是,在向前宣佈之後,該類別的成員也將在其後立即提供。 – bitwise

0

對於我來說,你的代碼給(正確的,恕我直言)錯誤:

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

這與G ++ 4.5.1。在這一點上你說:

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 *'成員,它不需要類定義,只需要一個聲明。 –

相關問題