Ich habe einen C++-Code und ich muss wirklich C-Funktion in ihm zu verwenden:
int procedure(... , S_fp fun , ...)
wobei fun - ein Zeiger auf eine Funktion ist, deren Signatur so sein muss:
int fun(double* , double* , double)
Die Funktion, deren Zeiger ich verwenden möchte, ist Mitglied einer Klassenvorlage:
template<int nPar> class PenaltyAlgorithm
{
public:
...
int Calculate(double* param, double* val, double prec)
{
...
}
...
}
Wie Sie sehen können, ist die Unterschrift in Ordnung. Aber wenn ich dies tue: procedure(... &PenaltyAlgorithm::Calculate, ...);
Ich erhalte eine Fehlermeldung:
error: cannot convert ‘int (PenaltyAlgorithm<30>::*)(double*, double*, double)’ to ‘int (*)(...)’ for argument ...
Bitte um Hilfe. Wenn Sie zusätzliche Informationen benötigen, schreiben Sie bitte.
Danke!!!
Nachdem ich die Antworten gelesen habe, habe ich verstanden, dass es wichtig ist, Informationen über die Klasse hinzuzufügen:
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). Ich kann nicht statische fun verwenden, weil diese fun brauchen, um Zugriff auf Mitglieder der Klasse zu erhalten;
2). Können wir die Tatsache nutzen, dass wir die "Prozedur" über das fun-Mitglied der Klasse aufrufen?