error LNK2019 无法解析的外部符号------类模板和内敛函数

时间:2021-12-11 21:15:41

今天用类模型实现一个单链表,开始是.h和.cpp将类模板的声明与实现分开写的,结果总是报错:

错误        error LNK2019: 无法解析的外部符号 "public: __thiscall SingleList<int>::~SingleList<int>(void)" (???$SingleList@H@@QAE@XZ),该符号在函数 _main 中被引用    F:\VsWorkSpace\SingleList\SingleList\test_main.obj    SingleList

摆弄了很久都不知道为啥,结果一百度不经意间看到,原来类模板的声明与实现是不能够分开写的。

《C++编程思想》第15章(第300页)说明了原因: 
模板定义很特殊。由template<…> 处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知。在编译器和连接器的某一处,有一机制能去掉指定模板的多重定义。所以为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。

最近遇到一个常识性错误,关于内联函数的(error LNK2019 无法解析的外部符号)。

通常编写函数时,会把声明放到头文件(*.h)中,而把函数定义放在源文件(*.cpp)中,在其他源文件中使用时包含对应的头文件即可。
但是内联函数(inline)不要定义在cpp文件中,因为我们通常都是包含头文件,而编译器在编译时会对内联函数进行展开操作,但是编译器只能在包含的头文件里搜索函数的定义体,如果头文件只有声明,显然编译器不知道该如何展开,于是就出错了。

每一个使用内联函数的地方,都应该知道内联函数的定义,所以内联函数就直接定义在头文件中。

reference:

C++的头文件和实现文件分别写什么

error LNK2019 无法解析的外部符号

C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?