2016-11-22 8 views
-1

リンクリストを作成しようとしています。ノードは次のように定義されます。テンプレート付きリンクリスト:暗黙的に削除されたデフォルトコンストラクタを呼び出す

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

プリミティブ型では、リンクリストは完全に機能します。しかし、私はそれをカスタムクラスのインスタンスを格納するために使用しようとすると、エラー "ノードの暗黙的に削除されたデフォルトのコンストラクタを呼び出す"を取得します。

私は、新しいノードを作成しようとするとTであるvalueを初期化していないという問題があると思います。しかし、私はそれを行う方法がわからないんだけど...

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の適切なコピーコンストラクタを呼び出す:

順番に、 Tを受け取るコンストラクタを持っているあなたの Nodeクラスが必要になり、
template<typename T> 
Node<T> *LinkedList<T>::makeNewNode(const T& val) 
{ 
    return new Node<T>(val); 

} 

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のコンストラクタ例えば

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

を使用してvalueフィールドを初期化する必要があります。コンストラクタを呼び出すときに値を直接指定します:

template<typename T> 
Node<T> *LinkedList<T>::makeNewNode(const T& val) 
{ 
    Node<T> *newNode = new Node<T>(val); 
    return newNode; 
} 
関連する問題