Boost logo

Boost Users :

Subject: Re: [Boost-users] [Lambda] Getting the bind incantation correct.
From: Robert Jones (robertgbjones_at_[hidden])
Date: 2011-05-23 08:06:31


On Mon, May 23, 2011 at 12:43 PM, Robert Jones <robertgbjones_at_[hidden]>wrote:

> On Mon, May 23, 2011 at 11:42 AM, 肖锋 <xfxyjwf_at_[hidden]> wrote:
>
>>
>>
>> On Mon, May 23, 2011 at 6:25 PM, Robert Jones <robertgbjones_at_[hidden]>wrote:
>>
>>> Hi All
>>>
>>> I'm trying to use std::vector::push_back() within a Boost.Lambda
>>> expression, but am finding it impossible
>>> to bind correctly. Can anyone tell me what I'm doing wrong in this code?
>>>
>>> Thanks in advance,
>>>
>>> - Rob.
>>>
>>> #include <vector>
>>> #include <boost/function.hpp>
>>> #include <boost/lambda/bind.hpp>
>>>
>>> void f( )
>>> {
>>> namespace ll = boost::lambda;
>>> using boost::function;
>>>
>>> typedef unsigned char Id;
>>> typedef std::vector<Id> Ids;
>>>
>>> ll::placeholder1_type x;
>>>
>>> Ids ids;
>>> void ( Ids::* push_back )( const Ids::value_type & ) = &
>>> Ids::push_back;
>>>
>>> function<void(Id)> my_push = ll::bind( push_back, ids, x ); // Line
>>> 18
>>>
>> Change ids to ll:var(ids) because the operation 'push_back' needs a
>> mutable object.
>>
>>>
>>> (void)my_push;
>>> }
>>>
>>> > g++ ignore.cpp
>>>
>>> [...lots of template instantiation errors, then...]
>>>
>>> ignore.cpp:18: instantiated from here
>>> /usr/include/boost/lambda/detail/actions.hpp:96: error: no matching
>>> function for call to ‘boost::lambda::function_adaptor<void
>>> (std::vector<unsigned char, std::allocator<unsigned char> >::*)(const
>>> unsigned char&)>::apply(void (std::vector<unsigned char,
>>> std::allocator<unsigned char> >::* const&)(const unsigned char&), const
>>> std::vector<unsigned char, std::allocator<unsigned char> >&, unsigned
>>> char&)’
>>> /usr/include/boost/lambda/detail/actions.hpp:96: error: return-statement
>>> with a value, in function returning 'void'
>>>
>>>
>>>
> Ok, many thanks, that worked. But why isn't "ids" mutable on its own?
>
>
>
Ahh, ok, answered my own question....

When "ids" is passed to the binder by reference a const copy is made inside
the binder, and it is this
which push_back attempts to modify, producing an error. Pass by pointer or
use var.

Thanks again.

- Rob.



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