C++如何将同个类内的成员函数作为参数传递给另一成员函数
错误原因
你遇到的C2064错误核心原因是:类的非静态成员函数默认携带隐式的this指针作为第一个入参,你直接传入的&myClass::odesys的实际调用签名是void(myClass*, state_type&, state_type&, double),而odeint的integrate_const要求传入的ODE函数签名是void(state_type&, state_type&, double),二者参数数量不匹配,因此编译失败。
可行解决方案
方案1:使用std::bind绑定this指针
先引入<functional>头文件,再把solver方法里的积分调用改成如下形式,用std::bind把隐式的this参数绑定固定,让最终的调用签名符合odeint的要求:
#include <functional> // 替换原有integrate_const代码行 integrate_const(runge_kutta4< state_type >(), std::bind(&myClass::odesys, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3), x, 0.0, 10.0, dt);
这里的三个占位符对应原odesys的三个显式入参x、dxdt、t。
方案2:使用lambda表达式捕获this(更推荐,C++11及以上版本支持)
不需要额外引入头文件,直接修改integrate_const的第二个参数,用lambda捕获当前类实例的this指针,在lambda内调用成员函数即可:
integrate_const(runge_kutta4< state_type >(), [this](state_type& x, state_type& dxdt, double t) { odesys(x, dxdt, t); }, x, 0.0, 10.0, dt);
这个方案语法更简洁,可读性也更高。
方案3:将odesys改为静态成员函数(仅做备选)
如果你的odesys逻辑不需要访问类的任何非静态成员变量/方法,也可以直接把它声明为静态成员函数,静态成员函数没有隐式this指针,签名直接符合要求:
// 修改odesys的声明 static void odesys(state_type& x, state_type& dxdt, double t) { // 原有逻辑保持不变 }
该方案局限性很高,只要odesys需要用到类的成员数据就无法使用。
内容的提问来源于stack exchange,提问作者ahmedsabriz
相关产品推荐
相关产品推荐

