有关模板类不能使用g++编译的问题
- 问题描述
今天在学习数据结构的时候,写一个矩阵类,使用到了模板,但是在编译的时候出现了如下错误。
/tmp/ccyX8J1m.o: In function `main':
test.cpp:(.text+0x31): undefined reference to `matrix<int>::matrix(int, int)'
collect2: error: ld returned 1 exit status
makefile:3: recipe for target 'tt' failed
make: *** [tt] Error 1
其中makefile文件内如下:
tt: test.cpp matrix.o
g++ test.cpp matrix.o -o tt
matrix.o: matrix.cpp
g++ -c matrix.cpp
clean:
rm *.o tt
无论怎么实验,总会有上述错误
- 解决办法
- 在网上找了很久的博客,最后发现错误原因是 使用g++编译模板类时,声明和实现要在一起,我一开始将声明和实现分别写到了.h和.cpp文件中
- 参照这篇博客
https://blog.youkuaiyun.com/u013049912/article/details/84936161
做的解释:模板定义很特殊。由template<…>处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知。在编译器和连接器的某一处,有一机制能去掉指定模板的多重定义。所以为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。