Error: undefined reference to `templatename' ( error LNK2019: 无法解析的外部符号......)

在ubuntu10.10下面编译MRF-benchmark/binary的时候,出现了undefined refrence to ......链接错误,这是个模版函数,编译文件包含了声明模版函数的头文件,但是模版的实现是在另一个源文件实现的。上网查了些资料才发现问题出在模版的声明和定义相分离上面,很多编译器不支持C++模版函数声明定义分离编译,g++就不支持,所以才出现找不到函数实现的问题。

对于模板类一般的编译链接会出错,这是因为模板类并不是一个具体的数据类型,只有将模板类的模板数据类型给定了,模板类才实例化为一个具体的类,然后在定义类对象。

解决办法:
一、将所有的成员函数实现部分放到头文件下面

缺点:这样做的话会使头文件太大,编译链接很慢

二、在需要用到模版函数的源文件中加入函数的实现

确定:这样会引起代码混乱,同样的函数实现多次出现,程序员编程效率不高。

三、建立一个新的文件,在新的文件里面实例化这个模板(这个是网友的方法,我还没试,试了再评价)
举例:
现有一个模板类
template<class key, class value>
class BSTree
{
...
};
定义在文件BSTree.h中,实现部分在BSTree.cpp中
在main.cpp中想按照BSTree<int,string>的方式调用这个模板类,则首先建立一个新文件
templateInstanceBSTree.cpp
#include "BSTree.cpp"
#include <string>
using namespace std;
template class BSTree<int,string>;

然后编译链接的时候使用templateInstanceBSTree.cpp而不是BSTree.cpp
即:
g++ -g -o main templateInstanceBSTree.cpp main.cpp
即可

你可能感兴趣的:(Error: undefined reference to `templatename' ( error LNK2019: 无法解析的外部符号......))