【问题标题】:Error when using a function as an argument of a function使用函数作为函数的参数时出错
【发布时间】:2016-09-23 23:49:05
【问题描述】:

我正在尝试创建一个程序来对两个限制之间的函数进行数值积分。我创建了一个最小示例(其中“整数”始终为 1.0)来说明我得到的错误。下面的代码尝试使用一个参数是两个双精度的函数和一个从双精度到双精度的函数:

#include <iostream>
#include <math.h>
double cons(double a, double b, double c(double d))
{        
    return 1.0;
}
double f(double x)
{
    return x*x;
}
int main()
{
    double x;
    double I = cons(0, 1, f(x));
    std::cout << I << "";
}

这会导致cpp.sh 出现错误:

14:31:错误:无法将参数 '3' 转换为 'double' 到 'double ()(double)' 到 'double cons(double, double, double ()(double) )'

显然,双精度函数和双值函数之间的区别在这里引起了问题。我怎样才能让它工作?

【问题讨论】:

  • 你试过double I = cons(0, 1, f); 吗?

标签: c++ function types


【解决方案1】:

你需要传递函数,而不是调用它。

#include <iostream>
#include <math.h>
double cons(double a, double b, double c(double d))
{        
    return 1.0;
}
double f(double x)
{
    return x*x;
}
int main()
{
    double x;
    double I = cons(0, 1, f);
    std::cout << I << "";
}

【讨论】:

  • OP 似乎想用 x 调用 f。建议将他们指向std::bind的方向。
  • @user4581301,我不确定这就是 OP 想要的。如果尝试计算函数的定积分(如帖子中所述),则 x 无关紧要。在我看来,OP 只是还不了解 C++ 的这一方面。
  • 足够好了。如果他们对谷歌足够感兴趣,我会在那里留下评论。
【解决方案2】:

你没有传递一个函数,而是一个函数的结果,一个双精度数。其次,您没有正确地将 函数指针 声明为参数。

如果你想传递一个双精度然后声明一个双精度作为参数:

double cons(double a, double b, double c)
{        
    return 1.0*a*b*c;
}
double f(double x)
{
    return x*x;
}
int main()
{
    double x;
    double I = cons(0, 1, f(x));
    std::cout << I << "";
}

如果你想传递一个函数(又名函数指针,因为C++不是函数式语言):

double cons(double a, double b, double (*c)(double d))
{        
    return 1.0*c(a);
}
double f(double x)
{
    return x*x;
}
int main()
{
    double x;
    double I = cons(0, 1, f);
    std::cout << I << "";
}

【讨论】:

  • 它无关紧要。声明衰减为函数指针,与 int a[3] 衰减为 int *a 的方式相同
  • 对,但是显式使用函数指针可以清楚地表明它不是已传递的函数。
  • 虽然 C++ 确实不是一种函数式语言,但它具有一些 FP 元素,在这种特殊情况下,std::function 是一个更好的选择。
【解决方案3】:

在这种情况下,您的问题是您正在调用函数:

double I = cons(0, 1, f(x));

所以你实际上给了 cons 的返回值 f() 而不是实际的函数。所以你需要写这个:

double I = cons(0, 1, f);

作为替代方案,您还可以使用 lambda 表达式来解决您的问题。例如这样的:

#include <iostream>
#include <math.h>
#include <functional>
double cons(double a, double b, const std::function<double(double)>& callback)
{        
    // do something 
}

int main()
{
    double x;
    double I = cons(0, 1, [](double x){ return x*x});
    std::cout << I << "";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-14
    • 2020-12-14
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多