2016-05-05 12 views
0

編集:これは、テンプレートでヘッダに定義されていない問題ではありませんでした。このエラーは、コピーコンストラクタを定義していないために発生しています。奇妙な未定義参照エラー

私はこれを見つけようとしましたが、適切なパラメータとその行に沿ったものがないと関数を呼び出す人以外の問題は見つかりませんでした。ですから、メインからの小さなチャンクはここにあります。テンプレート化されたコンテナクラスを作成し、文字列を保持するためのテストを初期化しました。 sorted.hは両方の.cppファイルに含まれています。ここ

エラー:http://imgur.com/OvdCHFO

// Test assignment operator 
    // Can test copy constructor by changing following two lines to 
    // sorted<string> test(songs); 
    sorted<string> test; 
    test = songs; // Error occurs when commenting this line back in. 

ここでは私のオーバーロードされた代入演算子あります。私は、これを使用している行をコメントするとリンカーエラーが発生するため、これが問題の原因であると想定しています。誰でも私がここで間違っていることを考えている?

//Overloaded assignment operator. (sorted.cpp) 
template <class T> 
sorted<T> sorted<T>::operator=(const sorted<T>& srtd){ 

    if (this != &srtd){ 
    delete [] m_data; 
    delete [] m_randfinal; 

    m_data = new T[srtd.m_capacity]; 
    m_randfinal = new T[srtd.m_size]; 
    m_size = srtd.m_size; 
    m_capacity = srtd.m_capacity; 

    for (int i = 0; i < m_size; i++){ 
     m_data[i] = srtd.m_data[i]; 
     m_randfinal[i] = srtd.m_randfinal[i]; 
    } 
    } 

    return *this; 
} 

sorted.hでの宣言。

// Overloaded assignment operator 
sorted<T> operator=(const sorted<T>& srtd); 
+1

テンプレート化されたクラスの実装は、コンパイラが正しくインスタンス化できるように、ヘッダーに配置する必要があります。 –

+0

ええ、私たちはヘッダーの最後にcppファイルを含めるように教えられていました。教授は、それは技術的には良い習慣ではないと言いましたが、当面はそれを取り巻いています。私のプログラムの他のすべては、この時点では動作しています。 – swingonaspiral

+0

私はそれをヘッダーファイルに移動しようとしましたが、ダイスは移動しませんでした。 – swingonaspiral

答えて

0

リンカーエラーメッセージは、コードがコピーコンストラクターを呼び出す必要があるが、それを見つけることができないことを示しています。コンストラクタを自分で定義した場合は、暗黙のコピーコンストラクタが無効になり、自分で定義する必要があることに注意してください。

また、テンプレート化されたクラスの実装は、コンパイラが正しくインスタンス化できるように、ヘッダーに配置する必要があります。