[英]g++ linker error: Getting undefined reference error for std::hash
[英]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.