2017-11-04 20 views
0

コンパイル時にこのエラーが発生し続けます。私はそれが私のテンプレートコンストラクタで何か間違っているかどうか、または私がどのように二重リンクリストに 'ハンドラ'型を挿入しているのか分かりません。右ここでは、完全なコードのためのコンストラクタは、デフォルトのコンストラクタを持たないメンバを明示的に初期化する必要があります

./ListNode.h:14:3: error: constructor for 'ListNode<Handler>' must explicitly 
     initialize the member 'data' which does not have a default constructor 
       ListNode(T d); 
       ^
./doublyLinked.h:70:25: note: in instantiation of member function 
     'ListNode<Handler>::ListNode' requested here 
     ListNode<T> *node= new ListNode<T>(d); 
          ^
simulation.cpp:56:20: note: in instantiation of member function 
     'DoublyLinkedList<Handler>::insertBack' requested here 
               handlerList->insertBack(*handler); 
                  ^
./ListNode.h:9:5: note: member is declared here 
       T data; 
       ^
./handler.h:4:7: note: 'Handler' declared here 
class Handler 
    ^

相続人はgithubの - > https://github.com/Cristianooo/Registrar-Simulator

答えて

0

https://isocpp.org/wiki/faq/ctors#init-lists

template <class T> 
ListNode<T>::ListNode(T d) 
{ 
    data=d; 
    next=NULL; 
    prev=NULL; 
} 

T dataために書いてはいけませんが適切に構築されていない場合ListNode<T>コンストラクタ走る

代わりTは、コピーコンストラクタを持っていると仮定し

template<class T> 
ListNode<T>::ListNode(const T& d) : data(d), next(0), prev(0) {} 

を書きます。

C++ 11では、nullptrを使用し、さらに、右辺値参照を使用してコピーせずにデータを置き換える方法を提供する必要があります。

template<class T> 
ListNode<T>::ListNode(T&& d) : data(std::move(d)), next(nullptr), prev(nullptr) {} 

はまた、C++ 11であなたもTからNode<T>に潜在的な暗黙的な変換を避けるためにexplicitとしてこれらのコンストラクタをマークすることができます。

template<class T> 
class ListNode { 
public: 
    explicit ListNode(const T& data); 
    explicit ListNode(T&& data); 
}; 

あなたのコードは、後でODR違反を引き起こす可能性があり.hファイル、非インラインコードを定義します。

関連する問題