LNK2001 链接错误:无法解析的外部符号,在实现线性表时遇到的问题

本人为大二学生,学期没有好好实现数据结构,因此决定在假期手把手实现,并且记录问题,这是我的第一篇(解决问题)博客,第一次写博客,不足之处很多,希望各位uu帮忙指正不足之处!

无法解析的外部符号"public: virtual void_cdecl SqList<int>:test_fun(void)" (?test fun@?
LNK2001
$SqList@H@@UEAAXXZ)

在实现顺序线性表的时候遇到的问题:链接错误,原图如下

可以看到:错误发生在.obj文件即目标文件,说明是编译通过但是链接阶段出现错误

下面展示我的代码:

SqList.hpp

#include"Constant.h"
#include"List.h"
using namespace std;

template<class T>
class SqList:List<T>
{
public:
	T* elem;      //保持不变,NULL 不存在栈
	int length;   //实际存放元素的个数
	int listSize; //可以存放元素的最大个数
public:
	SqList();
	~SqList();
	
    bool IsEmpty();
	T GetElem(int i);
	int LocateElem(T e);
	int Length();
	Status Insert(int i, T e);   //在i位置插入e
	Status Delete(int i, T& e);  //删除在i位置的函数,通过指针e返回
	Status Insert(T e); //在线性表末尾插入e

	Status Reverse();
	virtual void InputList();
	void OutputList();

	virtual void test_fun();
	//自己写的函数
	void ShowSqList();
};
//部分代码

//test.cpp文件

#include<iostream>
#include"List.h"
#include"SqList.hpp"

using namespace std;
int main()
{
	SqList<int> Sq;
	Sq.ShowSqList();

}

问题:

问题解析:问题出在模板类的虚函数实现上面,如果改类是模版类且含有虚函数,那么必须把这个虚函数实现。

  1. 模版类比较特殊,如果在源程序中实现了模板类,当我们在使用模板类或模板函数时,编译器需要在使用模板的地方知道模板的定义。这是因为模板实例化是在编译期完成的,每次使用模板时都会生成一个新的实例。如果找不到虚函数的实现,编译器在编译使用模板的代码时无法找到模板的实现,导致链接错误。

解决方式:在模板类的头文献中添加虚函数实现

	virtual void test_fun();
	//自己写的函数
	void ShowSqList();
};

template<class T>
void SqList<T>::test_fun()
{

}

另一个常见原因,参考文献

一些其他的话:

1、学数据结构的时候 一定要实现代码!虽然很累但一定要坚持!

2、在实现某一个模块的时候一定要及时检验,这一模块是否能够成功运行!(来自鹏哥(比特鹏哥的话)),不然等到项目全部做完再来检验可能会变成史山代码而难以维护!这个问题就是我在实现第一个插入时遇到的问题!

3、最后感谢您的阅读!如果对您有帮助希望给我点一个赞~希望我们一起进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值