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

SL & STL C++ Discussion :

for_each, appelle de fonction trans-classe:problème de syntaxe


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut for_each, appelle de fonction trans-classe:problème de syntaxe
    Bonsoir!
    Voici un petit code et le message du compilateur pour illustré mon problème.
    J'ai déja essayé plusieur choses pour que le troisieme argument de "for_each" soit perçu comme il ce doit par ce dernier mais je n'ai pas encore trouvé:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    #include <iostream>
    #include <vector>
     
     
    class B
    {
        public:
        B();
        ~B();
        protected:
        void _print(int);
    };
    class A
    {
        public:
        A();
        ~A();
        //void _affiche();
        void _modif();
        protected:
        B* m_pb;
        std::vector<int> m_list;
        //void _print(int);
    };
    int main(void)
    {
    //lorsque j'écrirai là, mon problème sera résolu!!
        return 0;
    }
    //definitions
    A::A():m_pb(new B)
    {
        for(int i=1;i!=10;i++){m_list.push_back(i);}
    }
    A::~A(){}
    B::B(){}
    B::~B(){}
    /*void A::_affiche()
    {
        for_each(m_list.begin(),m_list.end(),_print);
    }
    void A::_print(int i)
    {
        std::cout<<"i: "<<i;
    }*/
    void A::_modif()
    {
        for_each(m_list.begin(),m_list.end(),m_pb->_print);
    }
    void B::_print(int i)
    {
        std::cout<<"i mod: "<<i+2;
    }
    Lorsque je "dé-commente" les autres lignes le problème semble identique:
    /home/.../main.cc||In member function 'void A::_modif()'
    /home/.../main.cc|48|erreur: argument of type 'void (B:(int)' does not match 'void (B::*)(int)'|
    /usr/lib/gcc/x86_64-mandriva-linux-gnu/4.2.2/../../../../include/c++/4.2.2/bits/stl_algo.h||In function '_Function std::for_each(_InputIterator, _InputIterator, _Function) [with _InputIterator = __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, _Function = void (B::*)(int)]'
    /home/.../main.cc|48|instantiated from here|
    /usr/lib/gcc/x86_64-mandriva-linux-gnu/4.2.2/../../../../include/c++/4.2.2/bits/stl_algo.h|159|erreur: must use '.*' or '->*' to call pointer-to-member function in '__f (...)'|
    ||=== Build finished: 2 errors, 0 warnings ===|
    Je signal au passage que j'utilise un pointeur "B* m_pb" pour aller chercher la fonction car il me faut un moyen pour identifier une classe B précise. Peut être cela peut-il être fait autrement?

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for_each(m_list.begin(),m_list.end(), boost::bind(&B::_print, m_pb));

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut
    Dois-je nécessairement passer par boost?

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut
    Dans le même ordre d'idée, j'ai ajouté au code que j'ai trouvé là: http://www.cplusplus.com/reference/a.../for_each.html
    une classe possédant un std::vector<int> pour laquelle j'appelle la fonction myfunction dans le main. Le résultat (Le compilo ne dit rien) est inattendu:
    un ribambelle de 0 0 0 0 0 etc...

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut
    En fait j'ai réussi à faire fonctionner le code modifié, en déclarant le conteneur de la classe en public et en déclarant la fonction de la classe comme static:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    // for_each example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
     
    void myfunction (int i) {
      cout << " " << i;
    }
     
    struct myclass {
      void operator() (int i) {cout << " " << i;}
    } myobject;
    class A
    {
        public:
        A();
        ~A();
        vector<int> _list()const;
        vector<int> list;
        static void _affiche(int);
        protected:
     
    };
    int main () {
      vector<int> myvector;
      myvector.push_back(10);
      myvector.push_back(20);
      myvector.push_back(30);
     
      cout << "myvector contains:";
      for_each (myvector.begin(), myvector.end(), myfunction);
     
      // or:
      cout << "\nmyvector contains:";
      for_each (myvector.begin(), myvector.end(), myobject);
     
      cout << endl;
      A a;
      cout<<"Taille de A::list= "<<a._list().size()<<endl;
      for_each(a.list.begin(),a.list.end(),myfunction);
      cout<<endl;
      for_each(a.list.begin(),a.list.end(),A::_affiche);
     
      return 0;
    }
    A::A()
    {
        list.push_back(1);
        list.push_back(2);
        list.push_back(3);
    }
    A::~A(){}
    std::vector<int> A::_list()const{return list;}
    void A::_affiche(int i)
    {
         cout << " " << i;
    }
    Pourquoi toutes ces exigences? En plus la fonction en static ça m'arrange pas du tout...

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Krishna Voir le message
    Dois-je nécessairement passer par boost?
    non.
    Voici un tuto sur l'utilisation des algo de la STL
    http://r0d.developpez.com/articles/algos-stl/#LI-C

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut
    Merci pour le tuto et le site sgi.
    Je suis pourtant toujours coincé.Peut-être que cela n'a rien a voir mais Il me semble que mon cas diffère des exemples des liens en ce que je voudrais appeler une fonction membre à l'intérieur du constructeur de ma classe et que je ne manipule pas un std::vector<uneclasse> mais un std::vector<int>.
    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
    30
    31
    32
    33
    // for_each example
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    class A
    {
        public:
        A();
        ~A();
        vector<int> list;
        void _affiche(int);
    };
    int main ()
    {
        A a;
        for_each(a.list.begin(),a.list.end(),mem_fun_ref(&A::_affiche));
        return 0;
    }
    A::A()
    {
        list.push_back(1);
        list.push_back(2);
        list.push_back(3);
        //for_each(list.begin(),list.end(),mem_fun(&A::_affiche));-->Avec le
     même probleme à la compilation
    }
    A::~A(){}
    void A::_affiche(int i)
    {
         cout << " " << i;
    }
    Toujours est-il que les messages du compilo sont cryptique pour moi:
    /usr/../include/c++/4.2.2/bits/stl_algo.h||In function '_Function std::for_each(_InputIterator, _InputIterator, _Function) [with _InputIterator = __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, _Function = std::mem_fun1_ref_t<void, A, int>]'
    /home/.../main.cc|18|instantiated from here|
    /usr/../include/c++/4.2.2/bits/stl_algo.h|159|erreur: no match for call to '(std::mem_fun1_ref_t<void, A, int>) (int&)'|
    /usr/../include/c++/4.2.2/bits/stl_function.h|687|note: candidats sont: _Ret std::mem_fun1_ref_t<_Ret, _Tp, _Arg>::operator()(_Tp&, _Arg) const [with _Ret = void, _Tp = A, _Arg = int]|-->J'ai bien l'impression que ma fonction remplit les conditions non?
    ||=== Build finished: 1 errors, 0 warnings ===|

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Euh t'es sûr de comprendre ce que fait mem_fun ?
    Parce que là, t'essaies d'appeler la méthode _affiche sur un objet de type int...

    J'ai utilisé boost::bind parce que c'est le plus facile et pratique à utiliser.
    Tu peux aussi utiliser std::tr1::bind (<tr1/functional> il me semble), qui est dans ta bibliothèque standard, c'est la même chose.

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

Discussions similaires

  1. Appel de fonction problème class/template
    Par Niko_de_bordo dans le forum Langage
    Réponses: 3
    Dernier message: 15/04/2010, 00h48
  2. appel de fonction qui ne marche pas : syntaxe?
    Par adoptioninternationa dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 01/07/2008, 11h07
  3. Réponses: 3
    Dernier message: 07/03/2007, 11h38
  4. Appel de Fonction entre classes
    Par likenoother dans le forum C++
    Réponses: 5
    Dernier message: 09/08/2006, 14h37
  5. Réponses: 4
    Dernier message: 19/04/2004, 13h41

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