Boost logo

Boost Users :

From: Bill Buklis (boostuser_at_[hidden])
Date: 2007-10-15 14:20:04


In ptr_map, const_iterator does not represent value_type. Given this map:

typedef boost::ptr_map<DWORD, int> BOOSTMAP;

BOOSTMAP::value_type equates to:

boost::ptr_container_detail::ref_pair<DWORD, int* const>

BOOSTMAP::iterator does return this, but const_iterator returns:

boost::ptr_container_detail::ref_pair<DWORD, const int* const> which is
unlike std::map which represents const value_type for const_iterator. Since
this is a different structure, it's incompatible with BOOSTMAP::value_type.

The following code works using std::map:

        typedef std::map<DWORD, int*> STDMAP;
        int sample = 5;
        STDMAP sm;

        sm.insert( STDMAP::value_type(10,&sample) );

        STDMAP::iterator sfirst = sm.begin();
        STDMAP::const_iterator scfirst = sm.begin();
        STDMAP::value_type& svt = *sfirst;
        const STDMAP::value_type& scvt = *scfirst;

But, the same fails on the last line with boost::ptr_map

        typedef boost::ptr_map<DWORD, int> BOOSTMAP;
        BOOSTMAP bm;
        DWORD key = 10;

        bm.insert( key, new int(5) );

        BOOSTMAP::iterator bfirst = bm.begin();
        BOOSTMAP::const_iterator bcfirst = bm.begin();
        BOOSTMAP::value_type& bvt = *bfirst;
        const BOOSTMAP::value_type& bcvt = *bcfirst;

Also, it is not possible to bind to one of the members BOOSTMAP::value_type.
For example, this works with std::map, but fails with ptr_map:

boost::bind( &BOOSTMAP::value_type::first, _1 );

-- Bill --


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net