I ran your example and added some statements that I thought should be in del() :
assert(!(v_param < v_ptr)); assert(!(v_ptr < v_param));
One of them failed!
I put operator< for boost::shared_ptr in the implementation and found something strange: it compares the number of links, not the internal pointers! With a bit of digging, I found a mailing list about this problem with some useful links to two C ++ documents: N1590, which explains why people thought it was a good idea, and N2637, which explains why it wasnโt.
It seems that Boost people have not yet accepted recommendation N2637, but C ++ 11. Therefore, I again built the test using C ++ 11 ( g++ -std=c++0x ), removing using namespace boost; to use std::shared_ptr . This led to a terrible template error message, which was resolved by adding this at the top (easily got from boost/smart_ptr/shared_ptr.hpp ):
template<class T> inline T * get_pointer(std::shared_ptr<T> const & p) { return p.get(); }
And it works!
If you can't use C ++ 11, just use your own custom comparator for your set, which compares pointers:
template <typename T> struct SmartComparator { bool operator()(shared_ptr<T> const& lhs, shared_ptr<T> const& rhs) { return lhs.get() < rhs.get(); } };
Then it will work:
set< shared_ptr<Bar>, SmartComparator<Bar> > v_set;
source share