在分离实现与声明时使用模板类是不是搞错了什么——模板类与LNK2019

今天做数据结构的实验时需要自己实现堆栈,为了代码的优雅省事我选择使用模板类来实现堆栈,但这时却开始疯狂报错LNK2019,真的是可喜可贺并不
经过一番查阅发现,当把模板类的声明与实现分离写在两个独立的文件中,则构建时会出现”error LNK2019″错误。
原因时在实例化模板时,编译器会创建一个具有给定模板参数的新类,所以编译器必须在此时访问模板类方法的实现。但如果这些实现不在.h文件中,那么这些方法将不可访问,编译器无法实例化模板。
解决方法有三个:
1.在类的声明,即.h文件的最后包含类方法的实现文件,即.cpp。
2.在使用类的文件(一般为main文件)中同时引用模板类的接口文件和方法的实现文件,即.h和.cpp文件
3.最后一个办法就是把类方法的声明和定义都放在类的定义中。
为了保持代码的优雅我本来时打算使用第一个方法的,但是却出现了”C1014 包含文件太多” 和”E0003 文件包含自身”这些问题,又不想使用第三个方法——这样就失去了分文件的意义了。
最后折中一下,选择了第二种方法,在使用模板类的cpp文件中同时引用模板类的声明与实现,终于可以运行,可喜可贺,可喜可贺。

参考StackOverflow的回答

Leave a Reply

Your email address will not be published. Required fields are marked *