您的位置:首页 > 编程语言 > C语言/C++

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

2017-09-15 09:28 260 查看
本文,仅针对模板函数的写的位置做讨论(记录)。
         首先,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中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++模板