C++ 不支持模版的分离式编译

1、C++不支持模版的分离式编译,为什么?

  C++是分别,单独编译,对于每个cpp文件,预编译为编译单元,这个编译单元是自包含文件,编译的时候,不需要其他的文件,编译好了,生成obj文件,然后连接成exe文件。在编译的时候,使用一个东西,如果这个东西就在当前位置,当然好了。如果不再当前位置,也没关系,只要说,我有这个东西就行,这个东西在其他地方。在连接的时候,会找到这个东西在什么地方。

  考虑普通方法,通过上面的分析,是没有问题的。考虑模版方法:

  Fun.h声明一个方法模版,Fun.cpp包含Fun.h,并定义了方法模版,main.cpp包含Fun.h,然后使用方法。单独编译Fun.cpp,并不会生成特定版本的方法,因为C++规定,模版只有在使用的时候,才实例化一个方法(C++也做不到,因为有太多的类型,难道针对每个类型都实例化一个方法,显然不可能)。在main.cpp中,相当于声明了模版方法,但是不知道模版方法的定义,因此也没法实例化模版方法,只能希望连接器在其他的obj文件中,找到对应的实例化方法。但是在连接的时候,找不到对应的方法,连接错误。

2、上面问题的关键是:C++单独,分别编译。Fun.cpp定义了模版方法,但是没有使用,因此不会实例化模版方法。而在main.cpp中,使用了模版方法,但是不知道模版方法的定义,也没办法实例化方法,只能寄希望于连接的时候,从其他obj中找到,当然找不到,就出错了。

  解决的办法就是:把模版方法的定义也放到头文件中。包含这个头文件,并且使用模版方法,都会实例化一个对应的方法。这就会导致一个问题:不同的obj文件之间,会重复实例化模版方法。这个没关系,可以认为,连接的时候,只保留一个。

原文地址:https://www.cnblogs.com/nzbbody/p/3454548.html