2010-03-17 69 views
3

我有一个调用全局函数的问题,它将函数的指针作为参数。 这里是全局函数的声明:指向作为全局函数参数的C++类成员函数?

int lmdif (minpack_func_mn fcn, void *p, int m, int n, double *x, 
      double *fvec, double ftol) 

的“minpack_func_mn”符号是一个指向函数的类型定义,定义为:

typedef int (*minpack_func_mn)(void *p, int m, int n, const double *x, 
       double *fvec, int iflag); 

我想称之为“lmdif “函数指针指向我创建的类的成员,这里是此类函数的声明:

int LT_Calibrator::fcn(void *p, int m, int n, const double *x, 
         double *fvec,int iflag) 

我是调用像这样的全局函数:

info=lmdif(&LT_Calibrator::fcn, 0, m, n, x, fvec, ftol) 

不幸的是,我得到一个编译错误,它说: “错误C2664: 'lmdif':无法从“转换为int参数1(__thiscall LT_Calibrator :: *)(无效*,int,int,const double *,double *,int)'到'minpack_func_mn' 1>没有上下文可以进行这种转换“

有什么办法解决这个问题吗?

回答

1

您需要非成员或静态成员函数;一个成员函数指针不能用来代替你的函数类型,因为它需要一个实例来调用它。

如果您的功能不需要访问LT_Calibrator实例,那么您可以简单地将其声明为静态或使其成为自由函数。否则,看起来您可以使用第一个参数(void *p)将实例指针传递到“蹦床”功能,然后可以调用成员函数。沿此线的东西:

// member function 
int LT_Calibrator::fcn(int m, ...); 

// static (or non-member) trampoline 
static int fcn_trampoline(void *p, int m, ...) 
{ 
    return static_cast<LT_Calibrator*>(p)->fcn(m,...); 
} 

info = lmdif(&fcn_trampoline, this, m, ...); 
3

本质上有一个隐含的成员函数参数(this指针),这使得这个棘手。检查出this FAQ entry欲知更多信息。

4

在我看来像lmdif函数取“空缺* P”作为用户的说法,它只是传递给回调(minpack_func_mn FCN)。

如果是这种情况,只需将LT_Calibrator :: fcn设为静态函数,并将对象作为“p”参数传递即可。然后,如果需要,可以将用户参数(p)强制转换回来。

class LT_Calibrator 
{ 
public: 
    static int fcn(void *p, int m, int n, const double *x, double *fvec,int iflag) 
    { 
     LT_Calibrator* pCalibrator = static_cast<LT_Calibrator*>(p); 
    } 
}; 

然后调用,如:

LT_Calibrator someCalibrator; 

info=lmdif(&LT_Calibrator::fcn, &someCalibrator, m, n, x, fvec, ftol); 
相关问题