C++模板函数声明和实现分离

问:模板函数能否把声明和定义分开放在头文件和源文件中?

答:能,但是推荐做法是把定义也写在头文件里。

问:分开写,具体应该怎么写呢?

答:以两个数相加做例子,分别看看声明、定义、调用处的写法:

//a.h
#pragma once

template <typename T>
T func_add(T t1, T t2);
//a.cpp
#include "a.h"

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
#include "a.h"

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);,不然会报找不到函数定义的错。

参考文章

个人吐槽:如果想要把模板函数的声明和实现分离,还得自己挨个写一遍告诉编译器,那这个模板函数,就有点不“模板”了!