Error C3867 : pointeur vers une fonction membre [Résolu]

Zeplayerfou 7 Messages postés samedi 30 décembre 2000Date d'inscription 22 juin 2009 Dernière intervention - 27 déc. 2008 à 12:10 - Dernière réponse : Zeplayerfou 7 Messages postés samedi 30 décembre 2000Date d'inscription 22 juin 2009 Dernière intervention
- 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
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 27 déc. 2008 à 17:57
3
Merci
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.

Merci cs_rt15 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 120 internautes ce mois-ci

Commenter la réponse de cs_rt15
Zeplayerfou 7 Messages postés samedi 30 décembre 2000Date d'inscription 22 juin 2009 Dernière intervention - 27 déc. 2008 à 12:15
0
Merci
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 ?
Commenter la réponse de Zeplayerfou
Zeplayerfou 7 Messages postés samedi 30 décembre 2000Date d'inscription 22 juin 2009 Dernière intervention - 27 déc. 2008 à 12:17
0
Merci
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..
Commenter la réponse de Zeplayerfou
Zeplayerfou 7 Messages postés samedi 30 décembre 2000Date d'inscription 22 juin 2009 Dernière intervention - 27 déc. 2008 à 19:09
0
Merci
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!
Commenter la réponse de Zeplayerfou

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.