Boost logo

Boost :

From: Daniel Wallin (daniel_at_[hidden])
Date: 2006-12-19 16:16:53


Thorsten Ottosen wrote:
> Duane Murphy wrote:
>> I'm trying to use boost::ptr_map<> and cannot get calls insert to compile.
>>
>> I'm on Mac OS X using gcc 3.3 with Xcode.
>>
>> Even the most basic code fails to compile:
>>
>> boost::ptr_map< in, int* > my_map;
>> int * val = new int( 22 );
>> my_map.insert( 1, val );
>
> See http://www.boost.org/libs/ptr_container/doc/ptr_map_adapter.html
>
> The first argument needs to be a reference:
>
> int key = 1;
> my_map.insert( key, new int(22) );
>
> 1.34 adds the followinf overload:
>
> template< class U >
> std::pair<iterator,bool>
> insert( const key_type& key, std::auto_ptr<U> x )
>
> which does allow the key to be an rvalue (just don't create the auto_ptr
> in the function call).

Thorsten, I've suggested this before:

http://article.gmane.org/gmane.comp.lib.boost.devel/132706/match=re+ptr+container+boost+map

but I'll try again. Taking the key by reference guarantees nothing
except confused users. A more sane way to solve this would be to delay
possible implicit conversions until after the pointer has been protected:

  template <class K, class U>
  std::pair<iterator, bool> insert(K const& k, U* p)
  {
      std::auto_ptr<U> owned(p);
      this->insert(implicit_cast<key_type const&>(k), owned);
  }

-- 
Daniel Wallin
Boost Consulting
www.boost-consulting.com

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk