2010-11-04 117 views
0

我有一個模板類,像這樣的時候:無可用appropiate默認的構造函數使用模板類

template<class T> 
class List 
{ 
private: 
    struct node 
    { 
     T value; 
     node *next, *prev; 
    }; 
} 

當T = myClass的創建此列表類的實例*我沒有問題,因爲值將是一個指針,但如果它是一個對象,創建節點實例會導致「沒有適用的默認構造函數可用」錯誤,如果此類沒有默認構造函數。

我可以通過將T值更改爲T *值來解決此問題,但我需要將這些值的副本放入列表中,以便在列表之外移除它們時,它們在此處保持有效。

什麼是正確的方式來解決這個問題?

回答

1

您可以爲node一個構造函數,需要從該副本可以構造的T一個實例:

template<class T> 
class List 
{ 
private: 
    struct node 
    { 
     node(const T & init_value) : value(init_value) {} 
     T value; 
     node *next, *prev; 
    }; 
} 

這對T從缺省構造的改變要求拷貝構造。你列表中的任何類型都需要一個拷貝構造函數。

+1

當然,您可以將默認ctor添加爲過載。那意味着'T'需要是默認的或者可以共同構建的。 – MSalters 2010-11-04 09:52:04

+0

謝謝,這很好用:-) – NachoSoto 2010-11-04 10:04:22

+0

@NachoSoto:在這種情況下,隨意接受答案是正確的(答案左側的勾號)。 – 2010-11-04 10:35:10