Boost logo

Boost Users :

From: Rodolfo Lima (rodolfo_at_[hidden])
Date: 2008-06-01 15:59:22


Hi, is there any other reason (apart from begin a bug) that the
following code doesn't compile with g++-4.3?

#include <boost/ptr_container/ptr_map.hpp>

int main()
{
     boost::ptr_map<int,int> m1, m2;

     m1.insert(1,std::auto_ptr<int>(new int(2)));
     m2.insert(1,std::auto_ptr<int>(new int(2)));

     return m1 == m2;
}

gcc spits the following errors (be seated...):

/usr/lib/gcc/i686-pc-linux-gnu/4.3.0/include/g++-v4/bits/stl_algobase.h:
In static member function 'static bool
std::__equal<_BoolType>::equal(_II1, _II1, _II2) [with _II1 =
boost::ptr_map_iterator<std::_Rb_tree_const_iterator<std::pair<const
int, void*> >, int, const int* const>, _II2 =
boost::ptr_map_iterator<std::_Rb_tree_const_iterator<std::pair<const
int, void*> >, int, const int* const>, bool _BoolType = false]':

/usr/lib/gcc/i686-pc-linux-gnu/4.3.0/include/g++-v4/bits/stl_algobase.h:818:
   instantiated from 'bool std::__equal_aux(_II1, _II1, _II2) [with _II1
= boost::ptr_map_iterator<std::_Rb_tree_const_iterator<std::pair<const
int, void*> >, int, const int* const>, _II2 =
boost::ptr_map_iterator<std::_Rb_tree_const_iterator<std::pair<const
int, void*> >, int, const int* const>]'

/usr/lib/gcc/i686-pc-linux-gnu/4.3.0/include/g++-v4/bits/stl_algobase.h:950:
   instantiated from 'bool std::equal(_II1, _II1, _II2) [with _II1 =
boost::ptr_map_iterator<std::_Rb_tree_const_iterator<std::pair<const
int, void*> >, int, const int* const>, _II2 =
boost::ptr_map_iterator<std::_Rb_tree_const_iterator<std::pair<const
int, void*> >, int, const int* const>]'

/usr/include/boost/ptr_container/detail/reversible_ptr_container.hpp:441:
   instantiated from 'bool
boost::ptr_container_detail::reversible_ptr_container<Config,
CloneAllocator>::operator==(const
boost::ptr_container_detail::reversible_ptr_container<Config,
CloneAllocator>&) const [with Config =
boost::ptr_container_detail::map_config<int, std::map<int, void*,
std::less<int>, std::allocator<std::pair<const int, void*> > > >,
CloneAllocator = boost::heap_clone_allocator]'
teste.cpp:10: instantiated from here

/usr/lib/gcc/i686-pc-linux-gnu/4.3.0/include/g++-v4/bits/stl_algobase.h:789:
error: no match for 'operator==' in
'((boost::iterator_facade<boost::ptr_map_iterator<std::_Rb_tree_const_iterator<std::pair<const
int, void*> >, int, const int* const>,
boost::ptr_container_detail::ref_pair<int, const int* const>,
boost::bidirectional_traversal_tag,
boost::ptr_container_detail::ref_pair<int, const int* const>, int>*)(&
__first1))->boost::iterator_facade<I, V, TC, R, D>::operator* [with
Derived =
boost::ptr_map_iterator<std::_Rb_tree_const_iterator<std::pair<const
int, void*> >, int, const int* const>, Value =
boost::ptr_container_detail::ref_pair<int, const int* const>,
CategoryOrTraversal = boost::bidirectional_traversal_tag, Reference =
boost::ptr_container_detail::ref_pair<int, const int* const>, Difference
= int]() ==
((boost::iterator_facade<boost::ptr_map_iterator<std::_Rb_tree_const_iterator<std::pair<const
int, void*> >, int, const int* const>,
boost::ptr_container_detail::ref_pair<int, const int* const>,
boost::bidirectional_traversal_tag,
boost::ptr_container_detail::ref_pair<int, const int* const>, int>*)(&
__first2))->boost::iterator_facade<I, V, TC, R, D>::operator* [with
Derived =
boost::ptr_map_iterator<std::_Rb_tree_const_iterator<std::pair<const
int, void*> >, int, const int* const>, Value =
boost::ptr_container_detail::ref_pair<int, const int* const>,
CategoryOrTraversal = boost::bidirectional_traversal_tag, Reference =
boost::ptr_container_detail::ref_pair<int, const int* const>, Difference
= int]()'
make: ** [teste] Erro 1

My guess it that boost::ptr_container_detail::ref_pair should have an
equality operator (and a less than also) somehow.

In fact... by adding the following operator== to it the code compiles
and behaves as expected:

// #include <boost/utility/compare_pointees.hpp at top of the file
bool operator==(const ref_pair &that) const
{
        return first==that.first
                && boost::equal_pointees(second, that.second);
}

Something equivalent should be done for operator<

Any objections?

Regards,
rod


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