我试图将函数传递给函数,声明看起来像
double fun1(const double* ang, std::function<double(double)> f1)
在main()
中,我正在创建函数指针并将其指向另一个
作为
std::function<double(double)> f2 = &fun5; //line1
并将函数fun1
调用为
double x = fun1(&a,f2);
这很有效。但是,如果我将函数称为
double x = fun1(&a,&f2);
,它给出错误
无法转换'&amp; f2'从'std :: function *'到'std :: function
创建参考在line1
工作,但调用带参考的函数不起作用。知道为什么会这样吗?
答案 0 :(得分:6)
fun5
是一个功能&fun5
是指向类型函数的指针:double (*)(double)
f2
是一个特定类型的仿函数对象:function<double(double)>
&f2
是此仿函数对象的地址,其类型为:function<double(double)>*
因为fun1
期望一个仿函数对象传递它,所以指向仿函数对象的指针是非法的。如果这更简单,请考虑int
s。例如,如果我有一个函数:void foo(int arg)
,我有一个int bar
我无法做到:
foo(&bar)
这只是将int*
作为arg
传递,这显然是非法的。必须发生的是:
foo(bar)
同样,你的函数需要一个仿函数对象。你需要传递函子对象而不是指针,所以:
fun1(&a, f2)
答案 1 :(得分:0)
首先让我们了解一下这个场景,首先你创建了f2,这是&amp; fun5所以基本上你已经创建了一个fun5的别名,它是f2,现在根据你的函数参数,第二个参数需要像f2这样的函数你有在第一种情况下传递,但在第二种情况下你需要一个名为指针的特殊变量指向你传递的引用/地址,所以将第二个参数修改为* something,你的第二种情况就可以了。