今天在实现一个二叉树的时候,用到了模板,没在意,和平时一样写了两个文件:BinaryTree.h,BinaryTree.cpp。思路和平时一样,h文件中定义了模板类,然后在cpp文件中实现了一些功能函数。
然后在test.cpp中测试,遇到了一些问题、
问题出现如下:
- 使用g++直接编译的时候提示,基本上都是undefined reference to错误:
test_binarytree.cpp:(.text+0x16e): undefined reference to `BinaryTree<std::string>::BinaryTree()'
......
- 分别编译单独文件,均可生成 .o文件,所以排除单个文件本身的错误
- 连接两个o文件时,仍然提示上述错误,很明显,连接时,寻找函数出错了。
网上查的资料如下:
编译器不支持 模板类定义和实现的分离,即类定义和实现不能分开放在h头文件和cpp源码文件中;
经过测试,貌似把cpp文件的东西都搬到.h文件中,如果cpp文件还在,都还会提示该问题,所以,除了.h中放实现代码之外,还得把空的cpp文件删除。
从项目中删除后编译成功,但后来重新增加这个.cpp文件,貌似还是能编译成功。
上述的说法亲测正确,但仍有不足,补充资料留作记录:
首先C++中有分离编译的