On Mon, May 23, 2011 at 2:06 PM, Robert Jones
On Mon, May 23, 2011 at 12:43 PM, Robert Jones
wrote: On Mon, May 23, 2011 at 11:42 AM, 肖锋
wrote: On Mon, May 23, 2011 at 6:25 PM, Robert Jones
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
#include 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 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
::*)(const unsigned char&)>::apply(void (std::vector ::* const&)(const unsigned char&), const std::vector &, 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.
<shameless plug> You could have just used Phoenix: http://beta.boost.org/doc/libs/1_47_0_snapshot/libs/phoenix/doc/html/phoenix... It comes with push_back and all kind of other functions to support stdlib-like containers and algorithm directly.