我的问题与数字食谱有关。 我有一个全局函数来计算要最小化的函数的向量
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 &'
答案 0 :(得分:2)
在调用newt
时,您明确指定T
是VecDoub
(您指定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)
,因此显然无效。