最近使用C++模板,虽然工作几年了,但是模板用的很少,确切的说自己实现的机会很小。
昨天写了一个代码maxheap.h 中实现了类模板的声明,我将实现写在maxheap.cpp中,
当在main.cpp中引用maxheap中的接口时,提示链接错误。网上提供了几个解决方案,
第一种方式是将maxheap.h和maxheap.cpp包含在某个.h文件中,这样在main函数中
包含这个.h即可。第二种方式叫分离模式,我没看,觉得没必要搞得那么复杂。第三种方式
是我最看好的方式,就是将模板类的实现也放在.h中。C++ stl模板就是在.h中实现的。
C++编译文件将.cpp编译为.o文件,在链接阶段将.o文件链接生成可执行文件。问题
就出现在模板实现的.cpp文件并不在编译时实例化,读者可以试着在模板实现的.cpp里
写一些错误的代码,编译器并没有监测到,因为模板实现的cpp没有参与编译。他需要在特定类型
绑定后才会实例化,是延时的。
编译器使用模板,通过更换模板参数来创建数据类型。这个过程就是模板实例化(Instantiation)。
从模板类创建得到的类型称之为特例(specialization)。
模板实例化取决于编译器能够找到可用代码来创建特例(称之为实例化要素,
point of instantiation)。
要创建特例,编译器不但要看到模板的声明,还要看到模板的定义。
模板实例化过程是迟钝的,即只能用函数的定义来实现实例化。
所以将类模板的实现文件放在.h里,main函数包含该.h文件,当main函数用到该模板的特例化时
通过该.h就可以找到所有模板的实例化了。连接也没问题。
时间: 2024-10-24 17:30:37