IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Passage de fonction en paramètre d'une fonction.


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 57
    Par défaut Passage de fonction en paramètre d'une fonction.
    J'essaie de faire passer une fonction en paramètre d'une autre, mais le compilateur ne semble pas reconnaître le type.
    J'ai essayé avec et sans cast, mais cela n'y change rien.

    Voici le .h, suivi du .cpp et du message d'erreur.

    Quelqu'un saurait-il m'indiquer quelle est mon erreur?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    class Classification
    {
    	public :
     
    	class myClass;
    	typedef int (*ClassFunc)(myClass * inClass, char * Data, int & DataSize);
     
     
    	private :
     
    	class myClass
    	{};
     
     
    	int SaveClassToXML(myClass * ClassRoot, char * InputData, int & DataSize);
     
    	int SaveClassToXMLClose(myClass * ClassRoot, char * InputData, int & DataSize);
     
    	int ProcessTree(myClass * ClassRoot, ClassFunc PreProcessFunc, ClassFunc PostProcessFunc, char * Data, int & DataSize);
     
    	myClass * _Root;
     
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ProcessTree(_Root, &Classification::SaveClassToXML, (ClassFunc)&Classification::SaveClassToXMLClose, data, length);
    Classification.cpp(87) : error C2440: 'type cast' : cannot convert from 'int (__thiscall Classification::* )(Classification::myClass *,char *,int &)' to 'Classification::ClassFunc'
    There is no context in which this conversion is possible
    Classification.cpp(87) : error C2440: 'type cast' : cannot convert from 'int (__thiscall Classification::* )(Classification::myClass *,char *,int &)' to 'Classification::ClassFunc'
    There is no context in which this conversion is possible

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651

  3. #3
    Membre expérimenté
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par défaut
    Utilise boost::function si tu peux... Enfin, c'est juste un conseil

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 57
    Par défaut
    J'ai justement sorti SaveClassToXML de myClass pour éviter ce genre de problème.

    Pourquoi ce code ne compile pas avec une fonction membre ? Parce que le type de Fonction1 et MaClasse::Fonction2 n'est pas le même. La fonction globale Fonction1 a pour type DWORD (*)(void*).
    La fonction membre Fonction2 a pour type DWORD (MaClasse::*)(void*).
    Dans mon cas, il me semble que mes deux fonctions ont pour type (elle sont toutes les deux situées dans Classification):

    int (PLM3DSimilarClassification::* )(PLM3DSimilarClassification:: PLM3DSimilarClass *,char *,int &)



    Et pour Boost, je n'ai pas accès aux bibliothèques externes dans mon contexte de développement.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    J'ai justement sorti SaveClassToXML de myClass pour éviter ce genre de problème.
    SaveClassToXML est membre de Classification.

    Dans mon cas, il me semble que mes deux fonctions ont pour type:

    int (PLM3DSimilarClassification::* )(PLM3DSimilarClassification:: PLM3DSimilarClass *,char *,int &)
    Non :
    typedef int (*ClassFunc)(myClass * inClass, char * Data, int & DataSize);
    Ca c'est un prototype de fonction libre ou membre statique, mais en aucun cas de fonction membre d'une quelconque classe.

  6. #6
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Par défaut
    tu a essayer de caster celui ci ? &Classification::SaveClassToXML

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par GEIIMAN
    tu a essayer de caster celui ci ? &Classification::SaveClassToXML
    C'est sûr que forcer le compilo à passer un truc qui ne passe pas naturellement, c'est une belle solution. Pas de chance (ou plutôt si), même un cast bourrin n'arrive pas à faire passer une fonction membre en tant que fonction non-membre.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 57
    Par défaut
    Citation Envoyé par GEIIMAN
    tu a essayer de caster celui ci ? &Classification::SaveClassToXML
    Oui j'ai essayé, cela donne la même chose (tu peux le voir pour SaveClassToXMLClose).

    Laurent, le problème de la solution indiquée par ton lien est, si je ne me trompe pas, qu'elle rend la fonction statique.
    Or celle-ci utilise des données membres non statiques.

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Laurent, le problème de la solution indiquée par ton lien est, si je ne me trompe pas, qu'elle rend la fonction statique.
    Or celle-ci utilise des données membres non statiques.
    Y a pas de miracle, il faut que tu fasses un lien entre ta callback (qui ne pourra de toute façon jamais être membre non statique), et la ou les instances.

    Mais si c'est toi qui développe la classe qui prend en paramètre le callback, alors tu peux résoudre le problème à la racine, par exemple en utilisant boost.function ou en prenant une fonction membre de la bonne classe en paramètre.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 57
    Par défaut
    Effectivement, en mettant mes fonctions de callback statiques, ça passe à la compilation (pour l'exécution c'est une autre histoire).

    Merci beaucoup pour votre aide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/07/2007, 13h44
  2. Réponses: 14
    Dernier message: 07/06/2007, 19h40
  3. fonction en paramètre d'une fonction ?
    Par tuxout dans le forum Général Python
    Réponses: 1
    Dernier message: 02/06/2007, 15h54
  4. fonction comme paramètre d'une fonction
    Par velociraptor5679 dans le forum C++
    Réponses: 8
    Dernier message: 17/06/2006, 18h19
  5. Réponses: 4
    Dernier message: 01/12/2005, 12h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo