2016-11-22 61 views
-1

我想寫一個鏈表。節點如下定義:鏈接列表與模板:調用隱式刪除的默認構造函數

template<typename T> 
class Node { 
public: 
    T value; 
    Node<T> *next; 
}; 

對於原始類型,我的鏈表完美地工作。但是,當我嘗試使用它來存儲自定義類的實例時,出現「調用隱式刪除的Node的默認構造函數」錯誤。

我相信問題是,當我嘗試創建一個新節點時,我沒有初始化value,這是一個T。但我不知道該怎麼做......

template<typename T> 
Node<T> *LinkedList<T>::makeNewNode(T val) 
{ 
    Node<T> *newNode = new Node<T>; 
    newNode->value = val 
    newNode->next = NULL; 

    return newNode; 
} 

回答

0

雖然我不知道你的T是什麼,我認爲,這不是默認 - 構造的。在這種情況下,只需調用Node正確的拷貝構造函數:

template<typename T> 
Node<T> *LinkedList<T>::makeNewNode(const T& val) 
{ 
    return new Node<T>(val); 

} 

,這反過來,將要求您Node類,以便它接受T構造:

template<typename T> 
class Node { 
public: 
    T value; 
    Node<T> *next; 
    Node(const T& value) : value(value), next(nullptr) { } 
}; 
+0

這是否意味着我的T必須有一個複製構造函數? – jjiang

+0

@ahhhhhjulie,是的。 – SergeyA

0

Node構造應該初始化value字段,例如:

template<typename T> 
class Node { 
    public: 
     T value; 
     Node<T> *next; 
     Node(const T& value) : value(value), next(nullptr) { } 
}; 

然後當調用構造函數時直接提供值:

template<typename T> 
Node<T> *LinkedList<T>::makeNewNode(const T& val) 
{ 
    Node<T> *newNode = new Node<T>(val); 
    return newNode; 
}