‘undefined reference to’ 模板类
c++泛型编程时候,由于.h文件中放声明,.cpp里放实现,main里调用,编译时候,就出现这样的问题。
解决方法:
将实现放在.h文件里,即声明实现放在同一个头文件中。
缺点:会导致头文件比较大,加载,编译时候慢。
在.h头文件声明泛型类后,最后显示的实例化几个类。
缺点:用到的类型必须要显示实例化,如果没有枚举到,还是会出上述问题。
template<typename T> class A {};
template class A<int>;
template class A<string>;
原因分析;
嵌入式编程的同学对'undefined reference to xx'
应该很熟悉,一般出现这个问题,说明编译过程中,编译器只能找到代码的声明,却找不到具体的实现。需要坚持一下'-L'
后面的静态库查询地址是否齐全,这是题外话。
首先,编译器对待泛型模板,只是认为他是模板,在编译时候,能不实例化就不实例化,因为他也不知道你要咋样实例化,除非被迫显示声明T的具体类型,才会实例化。
但是编译过程中,对T对应的类型(比如int,string,float...
),必须要实例化一次(运行一次构造函数),才能正常使用。
在编译过程中,main.cpp和A.cpp
是单独编译的,main文件在编译时候,首先会隐式的实例化A<int>
这个类,但是A<int>
的成员函数的实现main函数找不到,只能找到A<T>
的实现,所以就会出现上述的错误。
解决办法就是上述的,强制编译器在编译A.cpp
时候 先进行对应类型实例化。(上述解决办法2)
(猜测)或者放在同一个文件下,A.h
的声明变成templete<int> A
,对应实现也应该会变成template<int> A::function()
这样的,就可以正常编译。
参考链接:
本文是在此链接上的理解+翻译
https://stackoverflow.com/questions/8752837/undefined-reference-to-template-class-constructor
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)