调用特例化的函数模板的前提是:编译器知道主动去调用模板,找到模板——调用其特例化版本。正如在测试用例中出现的那样。
函数、函数模板、函数模板的特例化
#include<iostream>
using namespace std;
//类模板
template<typename T>
class Experiment {
public:
Experiment(T val = 10) :_val(val) {};
void show() { cout << "void show()" << typeid(_val).name() << " " << _val << endl; }
private:
T _val;
};
//普通函数
void ordinaryFun(Experiment<int> a) //参数类型被确定
{
cout << "void fun1(Experiment<int> a)" << endl;
a.show();
}
//函数模板
template<typename T>
void fun(Experiment<T> a)
{
cout << "template<typename T> void fun(Experiment<T> a)" << endl;
a.show();
}
//函数模板的特例化 函数模板--->特例化 如果没有模板,谈什么特例化!!!
template<>
void fun(Experiment<int> a)
{
cout << "template<> void fun(Experiment<int> a)" << endl;
a.show();
}
int main()
{
Experiment<int> exp1(20);
fun(exp1);
//fun(20); //未能从“int”为“Experiment<T>”推导
//目标 类型隐式转换 int --> 类
cout << endl;
fun<int>(20);
cout << endl;
ordinaryFun(20);
return 0;
}