簡體   English   中英

g ++鏈接器錯誤:未定義的引用

[英]g++ linker error: undefined reference

我正在編寫一個模板化的Matrix類,並將聲明包含在Matrix.h ,將實現包含在Matrix.cpp 我有一個測試文件testMatrix.cpp

文件的開頭如下所示:

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

有誰知道這里出了什么問題? 非常感謝!

模板功能/類的實現必須在實例化時對編譯器可見。 這意味着您應該將整個模板放在頭文件中,而不是.cpp文件中。

首先,確保您已定義打印功能。 然后你應該知道,當你聲明一個模板化的類時,你需要在使用該類時提供實現。 換句話說,將實現移出.cpp文件並移入.h文件。

是的,實現必須在頭文件中,否則編譯器不知道需要專門的函數(在解析模板之后)。

您還可以將實現放在.inl文件(或simmilar)中,並將其包含在.h文件的末尾。 這就是通常的做法,在單獨的文件中保持decleration和實現(以保持清晰)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM