如何解决为什么默认模板类型不引用实例化中的指定类型?
#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)
}
— 结束示例 ]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。