0

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

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

在类函数run中,我尝试调用 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 &'
4

2 回答 2

2

在调用newt时明确指定TVecDoub(您指定newt<VecDoub>),但您将函数的地址传递给它,因此编译器无法将您的函数转换为VecDoub&. 如果你想要一个VecDoub&innewt然后调用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)

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

于 2012-10-19T15:58:03.193 回答
1

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

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

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

解释:

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

尝试调用类似于

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

您尝试传递的第三个参数是&vecfunctype VecDoub (__cdecl *)(VecDoub_I),因此它显然无法工作。

于 2012-10-19T15:47:03.160 回答