[Lambda] Getting the bind incantation correct.
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
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
On Mon, May 23, 2011 at 6:25 PM, Robert Jones
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' _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
On Mon, May 23, 2011 at 11:42 AM, 肖锋
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? - Rob.
On Mon, May 23, 2011 at 12:43 PM, Robert Jones
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.
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.
participants (3)
-
Robert Jones
-
Thomas Heller
-
肖锋