本人为大二学生,学期没有好好实现数据结构,因此决定在假期手把手实现,并且记录问题,这是我的第一篇(解决问题)博客,第一次写博客,不足之处很多,希望各位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();
}
问题:
问题解析:问题出在模板类的虚函数实现上面,如果改类是模版类且含有虚函数,那么必须把这个虚函数实现。
- 模版类比较特殊,如果在源程序中实现了模板类,当我们在使用模板类或模板函数时,编译器需要在使用模板的地方知道模板的定义。这是因为模板实例化是在编译期完成的,每次使用模板时都会生成一个新的实例。如果找不到虚函数的实现,编译器在编译使用模板的代码时无法找到模板的实现,导致链接错误。
解决方式:在模板类的头文献中添加虚函数实现
virtual void test_fun();
//自己写的函数
void ShowSqList();
};
template<class T>
void SqList<T>::test_fun()
{
}
一些其他的话:
1、学数据结构的时候 一定要实现代码!虽然很累但一定要坚持!
2、在实现某一个模块的时候一定要及时检验,这一模块是否能够成功运行!(来自鹏哥(比特鹏哥的话)),不然等到项目全部做完再来检验可能会变成史山代码而难以维护!这个问题就是我在实现第一个插入时遇到的问题!
3、最后感谢您的阅读!如果对您有帮助希望给我点一个赞~希望我们一起进步!