试图运行一个简单的程序来测试一个模板函数,但它总是导致没有匹配的函数发现错误


#include<iostream>
using namespace std;
template < class T, class V, class F, class R >
T Fct (T x, V y, F z, F p)
{
return x + (y + z) * p;
}
int main ()
{
int n = 1, p = 2;
float q = 2.3, r = 1.5;
double y = 3, z = 6;
unsigned m = 2;
const int h = 3;
cout << Fct (n, q, y, z);
cout << Fct (q, n, n, p);
cout << Fct (r, y, n, r);
cout << Fct (y, z, m, p);
cout << Fct (y, z, h, n);
cout << Fct (y, h, q, r);
cout << Fct (r, y, m, h);
cout << Fct (h, m, n, p);
return 1;
}

当我运行它时,它在每个cout操作上显示一个错误,说:

错误:没有匹配函数调用'Fct(double&, double&, const int&, int&)'

模板形参R没有在函数的参数列表中使用,因此无法推断,这就是编译器抱怨的原因。必须指定或推导所有模板参数。您应该使用R作为最后一个参数:

template<class T, class V, class F, class R> 
T Fct (T x, V y, F z, R p) {
return x + (y + z) * p;
}

注意,指定T作为返回类型将阻止混合不同类型时发生的正常提升。另一种方法是通过将返回类型指定为auto:

来让提升完成它的工作。
template<class T, class V, class F, class R> 
auto Fct (T x, V y, F z, R p) {
return x + (y + z) * p;
}

c++ 11版:

template<class T, class V, class F, class R> 
auto Fct (T x, V y, F z, R p) -> decltype(x + (y + z) * p) {
return x + (y + z) * p;
}

如果你删除R并使它

template<class T, class V, class F> 
T Fct (T x, V y, F z, F p) {
return x + (y + z) * p;
}

…如果您将不同的类型传递给zp,例如unsigned int&int&,则将无法编译程序。然而,如果你传递一个intconst int,F将被推导为int(不是引用),编译将成功。

最新更新