Error: undefined reference to `templatename<int,int >' ( 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
即可

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值