有关模板类不能使用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<…>处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知。在编译器和连接器的某一处,有一机制能去掉指定模板的多重定义。所以为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。

在尝试用g++编译包含模板类的C++程序时,遇到链接错误。问题源于模板类的声明和实现分别在.h和.cpp文件中。模板类的特殊性要求其声明和定义必须在同一处,以便编译器正确处理。解决方案是将模板类的完整定义放入头文件中,避免分开声明和实现导致的编译问题。
428





