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

Boost C++ Discussion :

Petite aide et compréhension à mon problème


Sujet :

Boost C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut Petite aide et compréhension à mon problème
    J'essaie d'utiliser boost::bind sur une map contenant comme valeur un shared_ptr, mais je me trompe quelque part car cela ne compile pas.


    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
    59
    60
    61
    62
    63
    64
     
    #include <iostream>
    #include <map>
    #include <vector>
    #include <functional>
    #include <boost/shared_ptr.hpp>
    #include <boost/bind.hpp>
    #include <typeinfo>
    #include <boost/assign/list_of.hpp>
     
    #define DECLARE_ATTRIBUTES_WITH_ACCESSORS(_TYPE,_NAME)      \
        private:    \
            _TYPE m##_NAME;    \
        public: \
            _TYPE _NAME() { return m##_NAME; } \
            void _NAME( _TYPE const & value ) { m##_NAME = value; } 
     
    class User {
        public:
            typedef boost::shared_ptr< User > SharedPtr;
            typedef std::vector< SharedPtr > Vector;
            typedef std::map< std::string, SharedPtr > Map;
     
        public:
            User( std::string const & _login ) { 
                login( _login );
            }
     
            std::ostream & print( std::ostream & oss ) {
                oss << "login: " << login() << std::endl 
                ;
                return oss;
            }
     
        DECLARE_ATTRIBUTES_WITH_ACCESSORS(int, age)
        DECLARE_ATTRIBUTES_WITH_ACCESSORS(std::string, login)
    };
     
    int main( int argc, char ** argv ) {
        try {
            User::Map users = 
                boost::assign::map_list_of
                ( "user1", new User( "user1" ) )
                ( "user2", new User( "user2" ) )
            ;
     
            /**
             */
            std::for_each( 
                users.begin(), users.end(),
                boost::bind( 
                    &User::print, 
                    boost::bind( User::Map::value_type::second, _1 ),
                    boost::ref( std::cout ) 
                )
            );
     
            /* std::for_each( users.begin(), users.end(), boost::bind( &User::print, _1, boost::ref( std::cout ) ) ); */        
        }
        catch( std::exception const & ex ) {
            std::cerr << "exception: " << ex.what() << std::endl;
        }
        return 0;
    }
    Voici le message d'erreur donné par gcc 4.1 et boost 1.34.1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_pair.h: In function ‘int main(int, char**)’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_pair.h:74: error: invalid use of non-static data member ‘std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::shared_ptr<User> >::second’
    bind.cpp:54: error: from this location
    Si vous avez des conseils ou des remarques, allez-y.
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::bind( User::Map::value_type::second, _1 )
    C'est un raccourci un peu trop rapide pour dire que tu souhaites utiliser le second membre de ta paire comme paramètre. Il va falloir ruser un peu plus.

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Aurais-tu un indice pour ruser ? J'essaie en // le concept de bind
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Effectivement, du second élément je retire le shared_ptr ce qui est logique.

    J'ai modifié mon code pour qu'il bind l'attribut de la pair,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    boost::bind( &User::Map::value_type::second, _1 ),
    ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            std::for_each(
                users.begin(), users.end(),
                boost::bind(
                    &User::print,
                    boost::bind( &User::Map::value_type::second, _1 ),
                    boost::ref( std::cout )
                )
            );
    Dois-je extraire le pointeur de mon shared_ptr ? en fait, j'ai un peu de mal à voir la direction à prendre pour arriver à mon but. Car lorsque je ne mets que des pointeurs d'instance dans la map, le code est fonctionnel.
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    J'ai exposé mon problème sur fr.comp.lang.c++ et j'ai obtenu une aide,
    mais la solution donnée me semble bizarre, car il faut réaliser un bind sur la méthode get du shared_ptr pour en extraire le ptr de base.

    Hors, lors de mes tests sur un vector< shared_ptr > je n'ai pas dû faire une telle opération.

    Un indice ?

    Sur ce, je colle le code qui fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    std::for_each(
    	users.begin(), users.end(),
    	boost::bind(
    		&User::print,
    		boost::bind(
    			&User::SharedPtr::get,
    			boost::bind( &User::Map::value_type::second, _1 )
    		),
    		boost::ref( std::cout )
    	)
    );
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  6. #6
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Voici une autre solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            std::for_each(
                mUsers.begin(), mUsers.end(),
                boost::bind(
                    &User::print,
                    boost::bind< User::SharedPtr & >(
                        &User::Map::value_type::second,
                        _1
                    ),
                    boost::ref( std::cout )
                )
            );
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

Discussions similaires

  1. Aide à la compréhension d'un petit script
    Par Ti-EN dans le forum VBScript
    Réponses: 5
    Dernier message: 03/05/2014, 12h33
  2. Petit aide pour un problème d'affichage
    Par Johnny P. dans le forum Débuter
    Réponses: 5
    Dernier message: 28/12/2010, 19h11
  3. Petite aide pour mon code javascript
    Par bennji dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/12/2008, 19h42
  4. Petite aide pour que mon appli soit utilisable via un VPN
    Par FredericB dans le forum C++Builder
    Réponses: 0
    Dernier message: 23/09/2007, 18h12

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