数值公式:如何在c ++中将函数作为函数newt的参数传递

时间:2012-10-19 15:44:23

标签: c++ function-pointers newtons-method

我的问题与数字食谱有关。 我有一个全局函数来计算要最小化的函数的向量

VecDoub vecfunc(VecDoub_I x) {
  // code is here
}

在类函数运行中,我尝试调用Numerical Recipes函数newt,它读取我的函数 vecfunc ,如图所示,

class A {
    void run() {
        VecDoub_IO pt;
        pt.resize(2);
        pt[0] = 0.5;
        pt[1] = 0.5;
        bool check = false;
        newt<VecDoub>(pt, check, &vecfunc);
    }
}

函数 newt 声明为

template <class T>
void newt(VecDoub_IO &x, Bool &check, T &vecfunc)

为什么我会收到以下编译器错误?

error C2664: 'newt' : cannot convert parameter 3 from 'VecDoub (__cdecl *)(VecDoub_I)' to 'VecDoub &'

2 个答案:

答案 0 :(得分:2)

在调用newt时,您明确指定TVecDoub(您指定newt<VecDoub>)但是您将函数的地址传递给它,因此编译器无法转换你对VecDoub&的功能。如果您想在VecDoub&中使用newt,请调用vectfunc并将其存储在临时变量中,然后将该变量传递给该函数(因为在newt中最后一个参数是参考到T)但是如果你真的需要newt中的函数,那么为什么你写newt<VecDoub>(pt, check, &vecfunc)而你可以写newt(pt, check, &vecfunc)并让C ++为你演绎这种类型?除此之外,为了接收newt中的函数,请不要通过引用获取它们,而是按值获取它们,因此newt应声明为:

template <class T>
void newt(VecDoub_IO &x, Bool &check, T vecfunc)

由于函数通常是小对象或指针,因此这将起作用并且不会降低性能

答案 1 :(得分:1)

因为你应该调用函数并将返回值作为参数传递,而不是函数本身。

newt<const VecDoub>(pt, check, vecfunc(something) );

我添加了const,因为引用需要是常量,否则vecfunc的返回值无法绑定到它,因为它是临时的。

解释:

newt<VecDoub>(pt, check, &vecfunc);

尝试调用类似于

的函数
newt_VecDoub(VecDoub_IO &x, Bool &check, VecDoub &vecfunc);

您尝试传递的第三个参数是&vecfunc,其类型为VecDoub (__cdecl *)(VecDoub_I),因此显然无效。