Bonjour,
J'ai défini un namespace comportant tout un ensemble de fonctions numériques dont certaines prennent des fonctions en arguments:
1 2 3 4 5 6 7
| namespace numeric
{
void f1();
void f2();
// ...
double integration(double (*func)(double));
} |
Ensuite dans une class C j'ai:
1 2 3 4 5 6 7 8 9
| using namespace numeric;
class C
{
// ....
double function(double d);
void example();
} |
1 2 3 4
| void C::example()
{
double d = integration(function); // ERROR
} |
Le problème est que dans la fonction example, là où on attend du double (*)double on reçoit du double ( C:: )double, d'où erreur à la compilation.
Ainsi, je peux régler cela en modifiant la fonction function en en faisant une fonction libre en dehors de la classe C.
Cela compile mais je n'ai plus accès aux variables membres de la classe C (j'en ai besoin).
J'ai essayé d'utiliser les template sans succès (error:<unresolved overloaded function type>).
J'ai réfléchi à utiliser une fonction membre static mais cela impliques des variables static aussi.
Vous l'aurez compris, je cherche un moyen de passer par arguments des méthodes membres à une fonction libre (définie dans un fichier et namespace à part).
Merci de votre aide.
EDIT 1
J'ai trouvé une solution pour effectuer l'appel en changeant la signature de integration:
1 2 3 4 5 6 7 8 9
| class C;
namespace numeric
{
void f1();
void f2();
// ...
double integration(double (C::*func)(double));
} |
Par contre dans le corps de integration, je n'arrive plus à appeler la fonction en argument:
1 2 3 4 5
| double integration(double (C::*func)(double))
{
double x = ....;
double f = (*func)(x); // NE MARCHE PLUS
} |
Il faut modifié l'appel mais je vois pas comment.
EDIT 2
Logiquement je pensais que cela devait être:
Mais ça ne marche pas non plus
error: expected primary-expression before .* token
Partager