c++泛型编程编译问题

时间:2022-01-05 01:40:09

‘undefined reference to’ 模板类

​ c++泛型编程时候,由于.h文件中放声明,.cpp里放实现,main里调用,编译时候,就出现这样的问题。

解决方法:

  1. 将实现放在.h文件里,即声明实现放在同一个头文件中。

    缺点:会导致头文件比较大,加载,编译时候慢。

  2. 在.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