2012-01-09 27 views
1

私はテンプレート化されたMatrixクラスを書いており、宣言はに、Matrix.cppに実装しています。私はテストファイルtestMatrix.cppを持っています。g ++リンカエラー:未定義参照

ファイルの先頭に次のようになります。

Matrix.h

#ifndef _MATRIX 
#define _MATRIX 
#include <string.h> 
// Definition of Matrix class 
#endif 

Matrix.cpp

#include "Matrix.h" 
#include <iostream> 
using namespace std; 
// ...Implementation 

testMatrix.cpp

#include "Matrix.h" 
#include <iostream> 
using namespace std; 
int main() { 
    cout << "Test constructors...\n"; 
    cout << "Unitialized matrix (4, 4):\n"; 
    Matrix<int> mi1 (4, 4); 
    mi1.print(); 
    cout << "4*4 matrix initialized to -1:\n"; 
    Matrix<int> mi2 (4, 4, -1); 
    mi2.print();                                  
    cout << "Constructing mi3 as a copy of mi2:\n"; 
    Matrix<int> mi3 (mi2); 
mi3.print();                                  
    cout << "Assigning mi3 to mi1:\n"; 
    mi1 = mi3; 
mi1.print();                                  

    return 0; 
} 

私がコンパイルに使用するコマンドライン:

g++ -Wall -lrt -g Matrix.cpp testMatrix.cpp -o testMatrix 

は、コンパイラは私にエラーを与え続け:

/tmp/ccofoNiO.o: In function `main': 
/afs/ir/users/t/i/tianxind/practice/Essential_C++/testMatrix.cpp:9: undefined reference to `Matrix<int>::print() const' 
collect2: ld returned 1 exit status 

誰もがここで何が悪かったのかのアイデアを持っていますか?本当にありがとう!

+0

'print()'関数を定義しましたか? – Mysticial

答えて

2

テンプレート関数/クラスの実装は、インスタンス化の時点でコンパイラに可視である必要があります。つまり、テンプレート全体を.cppファイルではなく、ヘッダーファイルに入れる必要があります。

1

まず、印刷機能を定義していることを確認してください。次に、テンプレート化されたクラスを宣言するときに、そのクラスを使用するたびに実装を提供する必要があることを知っておく必要があります。つまり、実装を.cppファイルから.hファイルに移動します。

0

ええ、実装はヘッダーファイル内になければなりません。そうでないと、コンパイラーは(テンプレートを解決した後で)特殊な関数を知りません。

実装を.inlファイル(またはsimmilar)にして、.hファイルの最後に含めることもできます。これは、通常、デクレレーションと実装を別々のファイルに保存すること(これを明確にするため)です。

関連する問題