Boost logo

Boost Users :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2005-11-21 21:38:21


Mark Santaniello (AMD) wrote:
>>> template< typename T >
>>> boost::function<T(T)> foo( T n_ )
>>> {
>>> //Works, but leaks n
>>> //T *n = new T( n_ );
>>>
>>> //Doesn't work
>>> boost::shared_ptr<T> n( new T(n_) );
>>>
>>> return ( *n += _1 );
>>
>> I think that you need to wrap n in boost::lambda::constant:
>>
>> return *constant(n) += _1;
>>
>> Without it, *n is evaluated immediately.
>>
>>> }
>>
>
> Peter,
>
> Thanks for the reply. I must be doing something dumb, because now I'm
> getting a build error.
>
> I think this *might* be the important part:
> /usr/include/boost/detail/is_incrementable.hpp:59: error: no match for
> 'operator++' in
> '++boost::detail::is_incrementable_::impl<boost::shared_ptr<int> >::x'

Apparently, boost::detail::is_incrementable doesn't work on your compiler;
this in turn breaks boost::indirect_reference and the return type deduction
for lambda's operator*. But I should also note that *constant(n) += _1
doesn't seem to work even when the compiler supports is_incrementable,
because for some reason, Lambda thinks that dereferencing a const pointer
yields a const reference.

   return ret<int&>( *constant(pn) ) += _1;

compiles for me, though.


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