#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&)'
没有匹配函数
发布于 2021-03-05 22:29:18
模板参数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;
}如果您将不同的类型传递给z和p (如unsigned int&和int& ),则unsigned int&将无法编译程序。但是,如果您传递一个int和const int,则F将被推导为int (而不是引用),并且编译将成功。
https://stackoverflow.com/questions/66500276
复制相似问题