数值配方:如何将函数作为C 中函数NEWT的参数传递
Numerical recipes: How to pass function as argument of function newt in c++
我的问题与数值配方有关。我有一个全局函数,该函数计算要最小化的函数向量
VecDoub vecfunc(VecDoub_I x) {
// code is here
}
在类函数 run 中,我尝试调用数值配方函数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 &'
在调用newt
时,您会明确指定T
是VecDoub
(指定的newt<VecDoub>
),但是您将函数的地址传递给了它,因此编译器无法将函数转换为VecDoub&
。如果要在newt
中使用VecDoub&
,请调用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)
由于功能通常是小物体或指针,因此它会起作用,并且不会降低性能
,因为您应该调用函数并将返回值传递为参数,而不是函数本身。
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)
,因此显然无法正常工作。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 数值配方:如何将函数作为C 中函数NEWT的参数传递