C++模板函数声明和实现分离
问:模板函数能否把声明和定义分开放在头文件和源文件中?
答:能,但是推荐做法是把定义也写在头文件里。
问:分开写,具体应该怎么写呢?
答:以两个数相加做例子,分别看看声明、定义、调用处的写法:
//a.h
template <typename T>
T func_add(T t1, T t2);
//a.cpp
template <typename T>
T func_add(T t1, T t2)
{
return t1 + t2;
}
template int func_add(int, int);
template double func_add(double, double);
//main.cpp
int main()
{
int a1 = func_add(3, 2);
printf("%d\n", a1);
double b1 = func_add(3.3, 2.2);
printf("%lf\n", b1);
char c1 = func_add('a', 'b');
printf("%c\n", c1);
system("pause");
return 0;
}
说明一:调用的时候可以显式的指明数据类型,如double b1 = func_add<double, double>(3.3, 2.2);
,如果程序员没有显式指明,那么编译器会自动推导类型。
说明二:如果是声明和实现分开写(如上面例子)的情况,在实际调用中,用到那种类型,就得指明让编译器去生成对应的定义,如上面程序,用到了char c1 = func_add('a', 'b');
,那就必须在a.cpp
里添加template char func_add(char, char);
,不然会报找不到函数定义的错。
个人吐槽:如果想要把模板函数的声明和实现分离,还得自己挨个写一遍告诉编译器,那这个模板函数,就有点不“模板”了!