我正在尝试创建一个程序,以在两个限制之间数字地集成一个函数。我创建了一个最小的例子(其中“积分”总是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:错误:无法将'double'转换为'double()(double)',将参数'3'转换为'double cons(double,double,double()(double) )'
显然,双精度和双值函数之间的区别在这里引起了一个问题。我怎样才能使这个工作?
答案 0 :(得分:8)
您需要传递该功能,而不是调用它。
#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 << "";
}
答案 1 :(得分:1)
你没有传递一个函数,而是一个函数的结果,一个double。其次,你没有正确地将函数指针声明为参数。
如果要传递double,则声明double为参数:
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 << "";
}
答案 2 :(得分:0)
在这种情况下,您的问题是您正在使用以下函数调用该函数:
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 << "";
}