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

Langage C++ Discussion :

problème C++1x et <functional>


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 11
    Par défaut problème C++1x et <functional>
    Bonjours !...

    Je bloque sur un code C++1x pourtant très bête, et sur une erreur de compilation incompréhensible :

    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
    #include <functional>
    using namespace std;
     
    class Event
    {
          public:
                Event & operator += (function < void (const Event &) > &_trigger)
                {
                       ;
                }
    };
     
    void onClick (const Event &e)
    {
          ;
    }
     
    int main ()
    {
          Event e;
          e += onClick;
    }
    j'ai largement éclairci le code je pense qu'il s'explique de lui-même. Comme vous pouvez le voir j'utilise les functional qui sont la partie C++1x du code. Ce code plante avec cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    In function ‘int main()’:
    21: error: no match foroperator+=’ in ‘e += onClick’
    7: note: candidates are: void Event::operator+=(std::function<void(const Event&)>&)
    === Build finished: 1 errors, 0 warnings ===
    En revanche en utilisant les pointeurs de fonctions classiques, ça fonctionne :

    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
    #include <functional>
    using namespace std;
     
    class Event
    {
          public:
                void operator += (void(* _trigger) (const Event &))
                {
                       ;
                }
    };
     
    void onClick (const Event &e)
    {
          ;
    }
     
    int main ()
    {
          Event e;
          e += onClick;
    }
    je ne comprend pas le rapport entre l'utilisation des functional et le message de l'erreur

    Mon but est évidemment d'utiliser les functional et non pas de rester sur les pointeurs de fonction classiques ! Qu'est ce que je dois corriger pour que mon code compile ??

  2. #2
    zul
    zul est déconnecté
    Membre chevronné Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Par défaut
    Passe ta function<> par copie. Ici tu essaye de créer une function<> temporaire par référence ce qui est interdit (tu peux soit la passer par copie ou par const ref, mais il est recommandé de passer les foncteurs par copie)).

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 11
    Par défaut
    Effectivement, ça marche avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Event & operator += (const function < void (const Event &) > &_trigger)
    Mais pourquoi ce n'est pas conseillé ? Ou plutôt pourquoi est-il conseillé de passer les foncteurs par copie ? Je veux dire que cela économise de la mémoire et du cpu de passer par des ref (certes ce n'est pas critique ici mais bon)

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 11
    Par défaut
    Re bonjour, c'est encore moi. Après de long mois d’abstinence je suis revenu au combat sur le terrain de std::functionnal.
    Et là, je rencontre un autre problème: Je ne sais pas comment utiliser un std::fonction<> sur une fonction membre, une méthode quoi. J'imagine que le problème vient de ce que je ne passe pas le pointeur sur l'objet, mais... je ne vois pas comment je dois faire ça ! mes recherches ne m'aident vraiment j'en reviens et ... impossible de trouver un exemple ou de comprendre ce qu'est mem_fun et autres

    mon code:
    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
    26
    27
    28
    29
    class Event
    {
          public:
                Event & operator += (const function < void (const Event &) > &func) {
     
     
                       return *this;
                }
    };
     
    class Form
    {
          public:
                Form ()
                {
                      eClick += onClick;
                }
     
                void onClick (const Event &e) {
                      ;
                }
     
                Event eClick;
    };
     
    int main ()
    {
          ;
    }
    les insultes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /home/charles/Projects/app/c++/bin/test/src/app.cpp||In constructor ‘Form::Form()’:|
    /home/charles/Projects/app/c++/bin/test/src/app.cpp|32|error: no match foroperator+=’ in ‘((Form*)this)->Form::eClick += ((Form*)this)->Form::onClick’|
    /home/charles/Projects/app/c++/bin/test/src/app.cpp|20|note: candidates are: Event& Event::operator+=(const std::function<void(const Event&)>&)|
    ||=== Build finished: 1 errors, 0 warnings ===|

  5. #5
    Invité
    Invité(e)
    Par défaut
    onClick n'a pas pour type void (const Event &) mais void (Form:: )(const Event &). Pour résoudre se problème soit :
    • tu n'utilises aucun membres de Form dans onClick, alors tu trasform onClick en fonction global(ou static)
    • tu utilises des membres de Form, alors tu attache this à onClick grace à std::bind
    Dernière modification par koala01 ; 28/11/2010 à 23h27. Motif: ajout d'un espace pour éviter l'évaluation d'un smiley

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 11
    Par défaut
    mmh voici ce que j'obtient en changeant le type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /home/charles/Projects/app/c++/bin/test/src/app.cpp|25|error: a call to a constructor cannot appear in a constant-expression|
    /home/charles/Projects/app/c++/bin/test/src/app.cpp|25|error: template argument 1 is invalid|
    /home/charles/Projects/app/c++/bin/test/src/app.cpp||In constructor ‘Form::Form()’:|
    /home/charles/Projects/app/c++/bin/test/src/app.cpp|37|error: no match foroperator+=’ in ‘((Form*)this)->Form::eClick += ((Form*)this)->Form::onClick’|
    ||=== Build finished: 3 errors, 0 warnings ===|
    Où la ligne 25 est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                Event & operator += (const function < void (Form::)(const Event &) > &func) {

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

Discussions similaires

  1. Problème entre Simulink et Matlab Function
    Par Océane88 dans le forum Simulink
    Réponses: 3
    Dernier message: 16/12/2014, 15h28
  2. Réponses: 1
    Dernier message: 11/01/2014, 19h57
  3. Problème passage de GtkFileFIlter à une function callback
    Par Spitfire 95 dans le forum GTK+ avec C & C++
    Réponses: 0
    Dernier message: 11/05/2012, 08h20
  4. [PHP 5.2] Problème : Call to a member function on a non-object
    Par Docteur_Hareng dans le forum Langage
    Réponses: 4
    Dernier message: 10/07/2009, 10h50
  5. Réponses: 8
    Dernier message: 10/04/2009, 14h46

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