模板无疑是非常复杂的,一个模板类。你把成员函数实现在类内,是比较简单的。当然,你也可以实现在类外。这时候你有两个选择,在同一个文件实现成员函数,在另一个.cpp里实现成员函数,头文件只包含函数声明。
当你写在同一个文件里的时候,只需要在函数实现的地方处处加上模板定义以及表明类是一个模板了即可。如下:
template<typename T> //模板的作用范围是紧随其后的一个类或者函数
Parent<T>::Parent(T a) //Parent<T>这里的<T>不能少,表明它是一个模板类。
{
this->a = a;
}
这时候,在你的main.cpp里包含这个头文件,编译即可正常通过。
但是当你在头文件里写上函数声明,在.cpp文件里写上函数实现。这时候你在main.cpp包含头文件之后,进行编译,会发现一堆错误,说找不到函数。对于模板出现的地方,你应当包含.cpp文件,这样就能编译通过。
通常我们是把函数声明和函数定义写在同一个文件里,并把这个文件叫做.hpp文件。例如OpenCV的头文件。
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/imgproc/imgproc.hpp>
一旦要使用模板,为了自己,也为了将来可能使用模板的人,我们一定要把它们写在同一个文件里。否则就可能造成各种各样的问题。
还有就是我们在模板类中尽量不要使用友元函数了,除非重载<<和>>运算符。