2011-12-08 82 views
3

我有一个C++代码,我真的需要使用C函数在它:函数指针和C++模板

int procedure(... , S_fp fun , ...) 

其中的乐趣 - 是一个函数指针,其签字必须是这样的:

int fun(double* , double* , double) 

功能,指针,我想用的,是一个类模板的成员:

template<int nPar> class PenaltyAlgorithm 
{ 
public: 
... 
int Calculate(double* param, double* val, double prec) 
{ 
    ... 
} 
... 
} 

正如你可以看到,它的签名是有序的。但是当我这样做时: 程序(... & PenaltyAlgorithm :: Calculate,...);

我得到错误:

error: cannot convert ‘int (PenaltyAlgorithm<30>::*)(double*, double*, double)’ to ‘int (*)(...)’ for argument ... 

请帮助。如果您需要任何其他信息,请写下。

谢谢!

阅读的答案后,我理解,这增加有关类的信息是很重要的:

template<int nPar> class PenaltyAlgorithm 
{ 
public: 
int Calculate(double* param, double* val, double prec) 
    { 
    *val = comp_fun->Compute(param); 
    } 

double* RunAlgorithm() 
    { 
     ... 
     procedure(... &PenaltyAlgorithm<nPar>::Calculate, ...); 
     ... 
    } 
... 
private: 
... 
CompositeFunction<nPar>* comp_fun; 
} 

1)。我不能使用静态乐趣,因为这个乐趣需要获得对类的成员的访问; 2)。我们可以使用这样一个事实,即我们从有趣的类的成员中调用'过程'吗?

+0

尝试'静态INT演算....' –

+1

上调用类的函数传递一个隐含的这个指针,以便您的签名显然是错误的。你应该阅读[C++ FAQ](http://www.parashift.com/c++-faq-lite/pointers-to-members.html) – stonemetal

回答

0

除非是静态成员函数,否则不能将这样的指针传递给成员函数。

0

你必须做出Calculate静态的,使用的

static int Calculate(double* param, double* val, double prec) 

代替

int Calculate(double* param, double* val, double prec) 
3

计算是PenaltyAlgorithm非静态方法。它需要执行PenaltyAlgorithm的一个实例,所以它不能作为一个普通的函数指针送入C函数。

计算函数可以静态吗?如果可以,它应该像C函数指针一样工作,只有它不能访问PenaltyAlgorithm类中的非静态数据。

1

请记住,int Calculate(double* param, double* val, double prec)作为一个实例成员具有隐藏的this指针,即全局函数或静态成员不会有。没有这个,它就不会知道在哪个PenaltyAlgorithm上运行它。

指针应该是int (PenaltyAlgorithm::*)(double* param, double* val, double prec)Calculate应该是静态的。

1

如果int procedure(... , S_fp fun , ...)肯定是C函数,那么就没有办法直接做你正在寻找的东西。如果你尝试传递一个类成员函数指针,它将隐藏这个指针作为它在堆栈中的第一个参数,因此原型不匹配。

但是,您可以创建一个全局函数或静态函数,它在内部使用保存的实例指针间接访问PenaltyAlgorithm类。 您可以尝试以下操作:

1)将要传递给procedure函数的类的实例指针保存为全局变量。

2)创建一个新的全球功能int CalculateGlobal(double* param, double* val, double prec)

3)传递CalculateGlobal函数指针的函数指针到您procedure功能。

4)CalculateGlobal函数可以使用保存的实例指针访问特定类的内部。

嗯,这不是做当然事情的好办法...