Error C3867 : pointeur vers une fonction membre

Résolu
Zeplayerfou Messages postés 7 Date d'inscription samedi 30 décembre 2000 Statut Membre Dernière intervention 22 juin 2009 - 27 déc. 2008 à 12:10
Zeplayerfou Messages postés 7 Date d'inscription samedi 30 décembre 2000 Statut Membre Dernière intervention 22 juin 2009 - 27 déc. 2008 à 19:09
Bonjour,

Je fais une petite application utilisant ODE, et je cherche à simuler la friction atmosphérique pour freiner les mouvements de type "rolling"

Je dispose d'une class ODESphere qui hérite d'une class abstraite ODEObject, qui me permet de créer facilement à la fois le body et la geom de mon objet, et qui est aussi capable d'en effectuer le rendu.

Afin de simuler la friction atmosphérique, je fais appelle au callback dBodySetMovedCallback(dBodyID, void(*)(dBodyID) ) tout en déclarant ma fonction de callback.

Je me retrouve donc avec ceci :

ODESphere::ODESphere()
{
// du code...

dBodySetMovedCallback(body,movedCallback);
}

void ODESphere::movedCallback(dBodyID _body)
{
// du code...
}

Et en tentant de compiler je me retrouve avec ce message d'erreur :
1>.\ODESphere.cpp(17) : error C3867: &'ODESphere::movedCallback' : liste d'arguments manquante dans l'appel de fonction ; utilisez 'ODESphere::movedCallback' pour créer un pointeur vers membre

Ce que je ne comprends pas, c'est que j'ai essayé de faire ça dans mon main.cpp, et là ça fonctionne à merveille. Comme me le dit le compilo, j'imagine qu'il y a une subtilité qui m'échappe pour créer des pointeurs vers des fonctions membres, mais je ne vois pas du tout laquelle

4 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
27 déc. 2008 à 17:57
Bienvenue,

Effectivement, il n'est pas forcément évident de coller (Ou de copier) des codes sur ce site. Et on ne peut pas éditer ses messages.

Concernant ton problème, le message d'erreur est (presque) un modèle de limpidité... Qui plus est, il est français. Encore que la traduction est peut être pas top.

Là il te dit que soit :
1) Il te manque les arguments dans ton appel de fonction
2) Tu as mal écrit ton pointeur sur le membre, et qu'il faudrait que tu l'écrive comme ça : 'ODESphere::movedCallback'.

Le "soit" n'est cependant il est vrai pas très clair dans ce message d'erreur.

Dans ton cas, vu le nom de la fonction avec callback dedans, tu es manifestement dans le deuxième cas. Il faut donc que tu écrive ton pointeur comme le compilo te le demande.

Par contre, je ne sais pas si la fonction que tu appelles attend un pointeur sur une méthode. Je crois qu'il faut que tu lui donne un pointeur sur une fonction classique. Comme ici.

Il faudra donc peut être que tu oublies un peu de C++ deux minutes pour revenir au C.
3
Zeplayerfou Messages postés 7 Date d'inscription samedi 30 décembre 2000 Statut Membre Dernière intervention 22 juin 2009
27 déc. 2008 à 12:15
hmm ça se voit tant que ça que c'est la première fois que je poste sur ce site ?

Comment ça se fait que mes retours chariots n'apparaissent pas ?
0
Zeplayerfou Messages postés 7 Date d'inscription samedi 30 décembre 2000 Statut Membre Dernière intervention 22 juin 2009
27 déc. 2008 à 12:17
Bonjour, Je fais une petite application utilisant ODE, et je cherche à simuler la friction atmosphérique pour freiner les mouvements de type "rolling".

Je dispose d'une class ODESphere qui hérite d'une class abstraite ODEObject, qui me permet de créer facilement à la fois le body et la geom de mon objet, et qui est aussi capable d'en effectuer le rendu.

Afin de simuler la friction atmosphérique, je fais appelle au callback dBodySetMovedCallback(dBodyID, void(*)(dBodyID) )
tout en déclarant ma fonction de callback.

Je me retrouve donc avec ceci :
ODESphere::ODESphere()
{
// du code...
dBodySetMovedCallback(body,movedCallback);
}

void ODESphere::movedCallback(dBodyID _body)
{
// du code...
}

Et en tentant de compiler je me retrouve avec ce message d'erreur :
1>.\ODESphere.cpp(17) : error C3867: &'ODESphere::movedCallback' : liste d'arguments manquante dans l'appel de fonction ; utilisez 'ODESphere::movedCallback' pour créer un pointeur vers membre.

Ce que je ne comprends pas, c'est que j'ai essayé de faire ça dans mon main.cpp, et là ça fonctionne à merveille.
Comme me le dit le compilo, j'imagine qu'il y a une subtilité qui m'échappe pour créer des pointeurs vers des fonctions membres, mais je ne vois pas du tout laquelle.


voilà désolé pour le triple post, mais jusqu'à présent je n'ai pas trouver s'il était possible d'éditer ses propres messages, mais bon avec des sauts de ligne c'est bcp plus clair !

Je viens de remarquer aussi que le sujet se trouve sous linux...mais en fait pas vraiment puisque je travaille sous VS2005..mais bon c'est de l'openGL..
0
Zeplayerfou Messages postés 7 Date d'inscription samedi 30 décembre 2000 Statut Membre Dernière intervention 22 juin 2009
27 déc. 2008 à 19:09
J'ai tenté les 2 méthodes :
si je donne les arguments, l'erreur provient d'un problème de conversion (impossible de convertir le 2 arguments de 'void' en void (__cdecl *)(dBodyID) )

Ensuite ecrire ODESphere::movedCallback ne change strictement rien.


Et en effet, utiliser une fonction classique est beaucoup plus efficace qu'une fonction membre !
Ensuite ayant très peu fait de C jusqu'à maintenant, il est vrai que j'ai peut-être chopper de mauvaises habitudes, comme vouloir mettre toutes les fonctions comme membres de ma classe ^^'.

En tout cas merci beaucoup!
0
Rejoignez-nous