【发布时间】:2013-10-03 20:17:26
【问题描述】:
我想编写一个包含所有函数(包括 GSL 函数)和参数的结构体,用于求解 ODE 系统。在主函数中,我只想调用结构中定义的更新函数,以将系统推进一个时间步长。然而,当我尝试这个时,我得到了错误:
Line 27, ERROR: cannot convert ‘ODE::funcS’ from type ‘int (ODE::)(double, const double*, double*, void*)’ to type ‘int (*)(double, const double*, double*, void*)’ Below is a minimal code. \
这是我的代码的最小版本:
#include <iostream>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_odeiv.h>
struct ODE
{
void update(double dt)
{
// code to advance ODE solution by one time-step dt
}
int
funcS (double t, const double y[], double f[],
void *params)
{
return GSL_SUCCESS;
}
double mu = 10;
gsl_odeiv_system sysS;
void
initializeSys()
{
sysS.function = funcS; //Line 27
}
};
int
func (double t, const double y[], double f[],
void *params)
{
return GSL_SUCCESS;
}
int main()
{
// GIVES ERROR
ODE mySys;
mySys.update(0.01);
// WORKS
double mu = 10;
gsl_odeiv_system sys;
sys.function = func;
return 0;
}
【问题讨论】:
-
查找“C++ 指向成员函数的指针”。
-
谢谢@us2012。使用
static int funcS解决了我的问题。我一定会阅读这个主题以完全理解! -
您可以轻松编写一个简单的包装器,以避免将所有需要发送到 GSL 的成员函数声明为静态。