我有一个功能模板:
template<typename T>
void fun(T a, T b){
.......
}
int a = 0;
double b = 1.2;
f(a, b);
可以自动转换为双倍吗?
答案 0 :(得分:7)
可以自动转换为双倍吗?
不,因为在template argument deduction中推断fun<int>
的类型时,fun<double>
和T
之间的含糊不清。
您可以明确指定模板参数,以使a
隐式转换为double
:
int a = 0;
double b = 1.2;
fun<double>(a, b);
或添加显式转换,以使模板参数演绎明确:
int a = 0;
double b = 1.2;
fun(static_cast<double>(a), b);
答案 1 :(得分:0)
不,它不能。在模板扣除过程中没有完成转换。在这种情况下,我们会从T
和a
独立推导b
,int
获取a
,double
获取b
- 因为我们推导T
是两种不同的类型,这是演绎失败。
如果你想进行转换,最简单的事情就是自己明确地做:
f(static_cast<double>(a), b);
或者明确地将模板参数提供给f
,以便不进行演绎:
f<double>(a, b);
答案 2 :(得分:0)
如果您的意图是将参数a
转换为参数b
的类型,则可以使用以下模板代替您的模板:
template<typename Ta, typename T>
void fun(Ta aTa, T b) {
T& a = static_cast<T>(aTa);
/* ... a and b have the same type T ... */
}
int a = 0;
double b = 1.2;
fun(a, b); // works fine