泛型编程
一般来说,我们组织工程文件时,A.h文件中实现声明,B.cpp文件中实现定义(该定义文件是否需要包含相应的.h文件?main.cpp在编译时,需要通过.h文件找到文件定义,但是B.cpp文件在编译时需要吗?函数实现本身就隐含了函数定义?因为如果子函数就在main.cpp中实现,而且不做单独声明,编译并不会报错),当对工程进行编译时,main.cpp和B.cpp被分别编译成二进制的.obj目标文件,然后链接器将二者连接起来,main函数中call subFunc时,目标文件中的相应指令指向B.obj中的实现代码,整体是一个可执行文件。
对于模板函数(类的实现还是类中函数方法的实现)来说,情况特殊。在一个B.cpp内,光有模板函数的实现而没有调用(或者光有类的定义而没有类的实例化),编译时不会生成二进制代码,这是编译器对模板函数和普通函数的区别对待之处。
所以要解决这个问题
1.让模板类的定义和模板类的实例化(函数调用)同时出现在一个编译文件中
具体来说,在头文件中实现模板函数
问题一:一般头文件不实现模板函数是为防止多重定义(?#ifndef不是可以解决吗)--但对于模板类来说,编译器和链接器有专门的机制去掉多重定义
问题二:头文件变很大,降低编译效率
2.专门用一个.cpp显示模板类的实例化,该cpp文件独立编译成.obj文件,链接时链接器能找到模板实例化,???编译B.cpp时并未生成函数的二进制代码,现在为什么就行了??????

浙公网安备 33010602011771号