![](/img/trans.png)
[英]error when passing `arma::cube`argument to function using RcppArmadillo
[英]Error when using a function as an argument of a function
我正在尝试创建一个程序,以数字方式将两个极限之间的函数进行积分。 我创建了一个最小的示例(其中“积分”始终为1.0)来说明出现的错误。 下面的代码尝试使用参数为两个double的函数和一个从double到double的函数:
#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))'
显然,双精度和双值函数之间的差异在这里引起了问题。 我该如何工作?
您需要传递函数,而不是调用它。
#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 << "";
}
您没有传递函数,而是传递函数的结果,即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 << "";
}
在这种情况下,您的问题是您使用以下方法调用该函数:
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 << "";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.