undefined reference to xxx之链接含有模板类的.o文件

undefined reference to xxx之链接含有模板类的.o文件

问题情况描述

编译一个简易服务器时,包含了多个.hpp和多个.cpp文件,将其成功编译为.o文件,在链接这些.o文件时,报错一个类的成员函数找不到其定义。
如下图
在这里插入图片描述

检查情况

  1. 判断函数是否是自己定义的函数还是其他的库函数 :若是库函数就是你没有将其对应的库链接上使用 -l[库名]、-L[库路径],有很多这种教程搜一搜,就可以找到,如果是自己定义的函数就继续往下看
  2. 检查函数名、参数在定义和声明是否相同:相同,继续往下看,不相同,就改成相同的试试。
  3. 检查报错的函数对应的类是否是模板类:不是以上这些情况我还没遇到,是模板类,使用一下解决办法:

###解决步骤:
在类的实现文件即.cpp文件中,在文末加上template class [类名]<使用时对应的类>
例子如下

#include <pthread.h>
#include <queue>
template<typename T>
class MsgQueue{
public:
MsgQueue();
~MsgQueue();
void Pop(T *msg);
void Push(const T& msg);
private:
std::queue<T> m_que;
pthread_mutex_t m_lock;
pthread_cond_t m_prod;
pthread_cond_t m_cons;
};
.cpp
#include "MsgQueue.hpp"

 template<typename T>
MsgQueue<T>::MsgQueue(){
//....
}
 template<typename T>
MsgQueue<T>::~MsgQueue(){
//.....
}
 template<typename T>
void MsgQueue<T>::Pop(T *msg){
//.....
}
void MsgQueue<T>::Push(const T& msg)
{
//......
}
//在其他文件中我要使用MsgQueue<int>那么此处加上
template class MsgQueue<int>
//在其他文件中还要使用MsgQueue<ChatMsg>那么就继续加上
template class MsgQueue<ChatMsg>

最后执行链接命令就成功了
这样做的原因,此时我理解的是编译时就要实例化,而模板类,编译时不清楚自己实例化时对应的类,所以使用此语句告知模板类需要实例化出类。

重要提示!!!!

若有大佬发现有误之处,望不吝指教,感谢感谢!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值