函数指针和C++;模板 我有一个C++代码,我真的需要用C函数: int procedure(... , S_fp fun , ...)

函数指针和C++;模板 我有一个C++代码,我真的需要用C函数: int procedure(... , S_fp fun , ...),c++,c,templates,function,pointers,C++,C,Templates,Function,Pointers,其中fun-是指向函数的指针,其签名必须如下所示: int fun(double* , double* , double) 我要使用的函数指针是类模板的成员: template<int nPar> class PenaltyAlgorithm { public: ... int Calculate(double* param, double* val, double prec) { ... } ... } 模板类惩罚算法 { 公众: ... int计算(双*参数、双*值、双

其中fun-是指向函数的指针,其签名必须如下所示:

int fun(double* , double* , double)
我要使用的函数指针是类模板的成员:

template<int nPar> class PenaltyAlgorithm
{
public:
...
int Calculate(double* param, double* val, double prec)
{
   ...
}
...
}
模板类惩罚算法
{
公众:
...
int计算(双*参数、双*值、双预计算)
{
...
}
...
}
正如你所看到的,它的签名是有序的。但当我这么做的时候: 程序(…&PenaltyAlgorithm::Calculate,…)

我得到一个错误:

error: cannot convert ‘int (PenaltyAlgorithm<30>::*)(double*, double*, double)’ to ‘int (*)(...)’ for argument ...
错误:无法将参数的“int(PenaltyAlgorithm::*)(double*,double*,double*,double)”转换为“int(*)(…)”。。。
请帮忙。如果您需要任何其他信息,请写信

谢谢

阅读答案后,我明白了添加有关课堂的信息很重要:

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;
}
模板类惩罚算法
{
公众:
int计算(双*参数、双*值、双预计算)
{
*val=comp_fun->Compute(参数);
}
双*运行算法()
{
...
程序(…&PenaltyAlgorithm::Calculate,…);
... 
}
...
私人:
...
复合功能*复合乐趣;
}
1) 。我不能使用静态乐趣,因为这种乐趣需要访问类成员


2) 。我们可以利用这样一个事实,我们从类的有趣成员调用“过程”吗?

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

必须使
计算
静态,使用

static int Calculate(double* param, double* val, double prec)
而不是

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

计算是一种非静态的惩罚算法。它需要一个PenaltyAlgorithm实例来执行,所以不能将它作为普通函数指针提供给C函数


计算功能是否可以设置为静态?如果可以的话,它应该和C函数指针一样工作,只是它不能访问PenaltyAlgorithm类中的非静态数据。

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

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

如果
int procedure(…,S_fp fun,…)
肯定是一个C函数,那么就没有办法直接执行您想要的操作。如果您尝试传递一个类成员函数指针,它将有一个隐藏的this指针作为堆栈中的第一个参数,因此原型将不匹配

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

1) 将要传递给
过程
函数的类的实例指针保存到全局变量

2) 创建一个新的全局函数
int CalculateGlobal(double*param,double*val,double prec)

3) 将
CalculateGlobal
函数的指针作为函数指针传递给
过程
函数

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


当然,这不是一种很好的方法…

在类上调用函数会传递一个隐式this指针,因此您的签名显然是错误的。你应该读书