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.