在包含编译模式下,我们在每个模板被实例化的文件中包含函数模板的定义,并且往往把它定义放在头文件中,像内联函数一样。但是,这是否以为着编译器必须在每个调用实例的文件中实例化同一模板参数实例呢?不,同一参数的模板函数只会被实例化定义一次,具体在哪个地方实例化定义要取决于编译器。
//template.h
#include
using namespace std;
extern void test1();
extern void test2();
template
void test(T a)
{
?cout<} //test1.cpp #include "template.h"void test1(){?test(1);?void (*p)(int)=&test;?cout<} //test2.cpp #include "template.h"void test2(){?test(2);?void (*p)(int)=&test;?cout<} //main.cpp #include "template.h"int main(){?test1();?test2(); ?return 0;} 程序输出结果: 10040129E20040129E 可以看出对于参数为int类型的test()函数,其只被实例化了一次,因为两次调用的函数入口地址都一样!