C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?

时间:2024-09-20 00:06:20

C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?

这个feature叫做Export Template,即外名模板,它的作用在于使得模板代码可依照C/C++语言习惯,将模板声明和实现分开分别放到.h和.cpp文件中,并且可以减少冗长的模板编译单元中分别实例化)。

Export Template曾经是被写入C++98标准中的,然并卵,很少有主流编译器在某编译main.cpp时,como的处理与其他编译square.cpp时,由于square模板声明是一个外名模板,虽然como不会为其生成任何模板实例代码,但是会额外生成一个square.et文件,其中包含对square函数模板实现的索引信息。之后进入一个预链接(prelink)阶段。在此阶段,编译时发现的对模板实例的需求,从所有et文件中查找到所需模板实现所在代码文件(cpp文件),并重新编译square.cpp以生成square<float>供链接使用。随后的链接过程和其他C++编译器处理全局类对象实例构造的过程,它们需要在main函数之前构造好。

而现代编译单元当场生成实例,随后在链接时从重复实例中随机挑选一个进行链接。然而为了支持Export Template,需要对现有编译器抛弃了。

于是C++的模板库,一定是开源的^ ^