文章目录
【C++】模板类出现链接错误“undefined reference to”!为什么 C++ 编译器对模板的分离式编译支持很弱??
1、遇到的问题
今天在写csapp家庭作业时,遇到一个奇怪的问题。make编译时老是说某些成员函数未定义(函数定义肯定是有的,编译也加上了对应的源文件,但还是说找不到函数定义)。
jxl@jxl-computer:~/note/CSAPP/ch12/tiny_pre_pthread/build$ make
[ 50%] Built target csapp
[ 75%] Linking CXX executable tiny
/usr/bin/ld: CMakeFiles/tiny.dir/tiny.cpp.o: in function `thread(void*)':
/home/jxl/note/CSAPP/ch12/tiny_pre_pthread/tiny.cpp:29: undefined reference to `Sbuf<int>::remove()'
/usr/bin/ld: CMakeFiles/tiny.dir/tiny.cpp.o: in function `main':
/home/jxl/note/CSAPP/ch12/tiny_pre_pthread/tiny.cpp:62: undefined reference to `Sbuf<int>::getItemNum()'
/usr/bin/ld: /home/jxl/note/CSAPP/ch12/tiny_pre_pthread/tiny.cpp:77: undefined reference to `Sbuf<int>::insert(int)'
/usr/bin/ld: CMakeFiles/tiny.dir/tiny.cpp.o: in function `__static_initialization_and_destruction_0(int, int)':
/home/jxl/note/CSAPP/ch12/tiny_pre_pthread/tiny.cpp:22: undefined reference to `Sbuf<int>::Sbuf(int)'
/usr/bin/ld: /home/jxl/note/CSAPP/ch12/tiny_pre_pthread/tiny.cpp:22: undefined reference to `Sbuf<int>::~Sbuf()'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/tiny.dir/build.make:85:tiny] 错误 1
make[1]: *** [CMakeFiles/Makefile2:78:CMakeFiles/tiny.dir/all] 错误 2
make: *** [Makefile:84:all] 错误 2
一开始我以为是由于c与c++混合编译产生的问题,但是把c文件都改为c++文件后,报错少了一些,但是还是有几个模板类成员函数无法链接。
后来才发现,一般而言,模板类的定义与实现需要放在一个.h(或.hpp)文件中。
2、但是为什么 C++ 编译器不能支持对模板的分离式编译?
在《C++ Primer Plus》中说到:当我们定义一个函数模板,在代码中包含函数模板本身并不会生成函数定义,它只是一个用于生成函数定义的方案。编译器使用模板为特定类型生成函数定义时,得到的是模板实例。
同理类模板也是如此:只有在实例化/具体化时,才能生成函数定义
- 隐式实例化:
ArrayTP<string, 10