问题描述
#include <typeinfo>
#include <iostream>
using namespace std;
template<typename T,typename U = T> void f1(T a,U b)
{
cout<<typeid(a).name()<<endl;
cout<<typeid(b).name()<<endl;
}
int main()
{
f1<float>(1,2);
}
输出:
f
i ----> 为什么它不是根据模板实例的默认浮点数?
解决方法
默认模板参数是最后的手段,仅在未指定或推导参数时使用。
它在 [temp.deduct]/5 中指定:
得到的替换和调整后的函数类型用作 用于模板参数推导的函数模板的类型。如果一个 模板参数尚未推导出及其对应的模板 参数有一个默认参数,模板参数是确定的 通过替换为前面确定的模板参数 模板参数转换为默认参数。如果替换 导致无效类型,如上所述,类型推导失败。 [ 示例:
template <class T,class U = double>
void f(T t = 0,U u = 0);
void g() {
f(1,'c'); // f<int,char>(1,'c')
f(1); // f<int,double>(1,0)
f(); // error: T cannot be deduced
f<int>(); // f<int,double>(0,0)
f<int,char>(); // f<int,char>(0,0)
}
— 结束示例 ]