c++ 模板的实现位置讨论(.h cpp)

本文,仅针对模板函数的写的位置做讨论(记录)。

         首先,c++的模板是要有调用,才会被编译的。  因为本身函数要被编译成具体的参数,函数名,返回值类型的一条函数记录(个人理解),记录在函数表中, 而模板本身就是一个泛型, 只有被调用的时候才会产生一个具体的函数记录。  比如

      

template <class DATA_TYPE>

Class TestC

{

Public:

                  DATA_TYPE test_max(DATA_TYPEd1, DATA_TYPE d2)  { return max(d1, d2); }

}

         有相应的调用test_max(2,3),    test_max(1.1,  3.6)  那么就会产生两条函数记录(一个整形,一个浮点型), 如果一个调用也没有,那么模板就不会被编译,当然那这个模板函数里面随便你怎么写(没有语法都行,调用未知函数都行),也不会报错,因为不会编译。

 

         那么,现在说模板类的成员函数的实现位置。

1, 可以直接写在类中。(.h中)

template <class DATA_TYPE>

Class TestC

{

Public:

                   DATA_TYPE test_max(DATA_TYPEd1, DATA_TYPE d2)  { return max(d1, d2); }

}

                  

                   那么这样当然是没什么问题,而且其他模块引用这个类的函数也没问题。

2,  写在类外 (.h 头文件中)

和上面一样,只是把实现写在类外,但是注意是写在头文件中(因为这样,此头文件被引用的时候,就会被编译)  (c++只会编译.cpp文件,而cpp中include的头文件也会 被编译,其他的就不会编译了)

 

这样也没问题,它也会被编译,其他模块引用也就没问题。

3,  写在类外 (cpp文件中)

这里也是要着重说明的地方,分两种情况;

第一,  此函数只被内部引用。

就是说,这个模板函数只被这个类的其他函数引用,而没有别外面的类或函数引用(有点priavte的意思),那么这个也没有问题,因为本身.cpp就会被编译,那么会i nclude它的头文件,发现此模板函数有被引用,那么就会编译。

第二,  此函数被外部引用。

那么问题来了,当然编译本身这个cpp的时候,没有发现有引用的地方,那么就不会被编译,而编译引用这个模板函数的cpp的时候,要直接调用这个函数,就会发现这个 函数没有编译,没有实现,所以报错,找不到该函数。

 

 


         总结: 模板函数实现写在头文件里面,没任何问题,外部可以引用,  如果模板函数只被类自己引用,那么可以写在cpp中,如果函数要被外部引用,那么就不能写在cpp中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值