本文,仅针对模板函数的写的位置做讨论(记录)。
首先,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中