#include <iostream>
#include <string>
template <class T>
void ChangeValue(T*, T);
int main()
{
int x = 51;
ChangeValue(&x, 7);
std::cout << x;
float y = 5.1;
ChangeValue(&y, 7.9);
std::cout << y;
}
template <class T>
void ChangeValue(T* Value, T NewValue)
{
*Value = NewValue;
}
答案 0 :(得分:3)
&y
的类型为float*
,其中7.9
的类型为double
。编译器可以通过将T
与float
匹配来推导float*
为T* Value
,或者可以通过将double
与{{1}匹配来推断double
}。要使模板参数推断成功,它必须是明确的。试试这个:
T NewValue
通过此更改,float y = 5.1f;
ChangeValue(&y, 7.9f);
被推断为T
。
答案 1 :(得分:3)
使用时:
float y = 5.1;
ChangeValue(&y, 7.9);
第一个参数的类型是float*
,而第二个参数的类型是double
。因此,编译器无法推导出T
。
解决这个问题的一种方法是使用:
template <typename T1, typename T2 = T1>
void ChangeValue(T1* Value, T2 NewValue)
{
*Value = NewValue;
}
有了这个,T2
是从T1
推导出来的,除非用户明确覆盖它。
float y = 5.1;
ChangeValue<float, double>(&y, 7.9);
只要
,什么会起作用 *Value = NewValue;
对给定的T1
和T2
有效。