之前我一直以为,类的定义写在头文件中,成员函数的实现写在.cpp文件里,直到我今天写了模板类,出现了LNK2019和LNK1120,一直找不到出错的原因,百度了一下才知道,如果将类模板的声明和实现写在两个独立的文件里,在构建时出现这样的错误。
解决方法:
第一种:将模板的声明和实现写在同一个文件中
第二种:在主文件(main文件)中,既包含类模板声明文件(.h文件),又包含类模板的实现文件(.cpp文件)
第三种:在类模板声明文件的最后包含类模板的实现文件
出错原因:
因为模板类和模板函数只有在使用时才会实例化。当模板被使用时,编译器需要函数的所有代码,来用合适的类型去构建正确的函数,而如果函数的实现写在一个独立的源文件中,这些文件是不可见的,因此会出错。
其实出错原因还是不太懂。。。。
时隔一周,我终于找到了另一种解决办法,在数据结构老师的实验指导中,说明了:
删除(不是“移除”)LinkedList项目中的下述文件:
a.<头文件>中的 stdafx.h 和 targetver.h
b.<源文件>中的 stdafx.cpp
c.打开 LinkedList.cpp,
删掉引用:#include “stdafx.h”,
删掉自动生成的主函数代码:
int _tmain(int argc, _TCHAR* argv[]) {
return 0;
}
老师说的是VC++不允许模板类的声明和实现分别写在.h和.cpp文件中,我的VS2017也不允许这么做。经过这样的处理之后,就形成一个清洁的.cpp文件,以后就将数据结构写在这样一个清洁的源文件中,在main函数在文件开头,将这个.cpp文件include即可。
本文探讨了在C++中使用模板类时遇到的LNK2019和LNK1120编译错误,并提供了多种解决方案。通过将模板的声明与实现放在同一文件或特定配置中,可以避免链接阶段的问题。
5281

被折叠的 条评论
为什么被折叠?



