‘undefined reference to’ 模板类
c++泛型编程时候,由于.h文件中放声明,.cpp里放实现,main里调用,编译时候,就出现这样的问题。
解决方法:
-
将实现放在.h文件里,即声明实现放在同一个头文件中。
缺点:会导致头文件比较大,加载,编译时候慢。
-
在.h头文件声明泛型类后,最后显示的实例化几个类。
缺点:用到的类型必须要显示实例化,如果没有枚举到,还是会出上述问题。
template<typename T> class A {};//声明完成 template class A<int>; //显示实例化了int的A类 template class A<string>; //在后面实现时候,int,string的A类因为显示实例化了,所以调用时候不会有上述'undefined reference to class xx'的问题
原因分析;
嵌入式编程的同学对'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://*.com/questions/8752837/undefined-reference-to-template-class-constructor