首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试运行一个简单的程序来测试一个模板函数,但是它总是导致函数查找错误的不匹配。

尝试运行一个简单的程序来测试一个模板函数,但是它总是导致函数查找错误的不匹配。
EN

Stack Overflow用户
提问于 2021-03-05 22:13:43
回答 1查看 44关注 0票数 0
代码语言:javascript
复制
#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&)'

没有匹配函数

EN

回答 1

Stack Overflow用户

发布于 2021-03-05 22:29:18

模板参数R不在函数的参数列表中使用,因此无法推导,这就是编译器抱怨的原因。必须指定或推导所有模板参数。很可能应该在最后一个参数中使用R

代码语言:javascript
复制
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来让促销完成它的工作。

代码语言:javascript
复制
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版本:

代码语言:javascript
复制
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并使其成为

代码语言:javascript
复制
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& ),则unsigned int&将无法编译程序。但是,如果您传递一个intconst int,则F将被推导为int (而不是引用),并且编译将成功。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66500276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档