
Hi again, As can can probably guess, I'm just learning how to use the BLL. Here's another testcase I'm having trouble with: #include <boost/lambda/lambda.hpp> #include <boost/lambda/bind.hpp> #include <boost/iterator/counting_iterator.hpp> #include <vector> #include <algorithm> #include <cassert> class Test { private: int value; public: Test(int v) : value(v) {}; int get(void) const { return(value); }; }; std::vector<Test> seq; std::vector<Test>::iterator find_value(const Test &value) { using boost::lambda::bind; using boost::lambda::_1; return(std::find(seq.begin(), seq.end(), bind(&Test::get, _1) == value.get())); } int main(void) { std::copy(boost::counting_iterator<int>(0), boost::counting_iterator<int>(10), std::back_inserter(seq)); std::vector<Test>::iterator i = find_value(0); assert(i == seq.begin()); i = find_value(5); assert(i != seq.end()); i = find_value(11); assert(i == seq.end()); return(0); } [compile log below] Another question: when using bind to delay application of the member function to the object, is the object passed by reference or value on invocation? If by value, is there a way to pass it by reference? It's not relevant to this test but will be in the code I'm working on. I'm thinking of cases where I might want to run transform algorithms on Test objects. Thanks for your help. Some of this is just learning to pattern-match gcc's cryptic template error messages. -Dave ------------------- /usr/include/c++/3.3.3/bits/stl_algo.h: In function `_RandomAccessIter std::find(_RandomAccessIter, _RandomAccessIter, const _Tp&, std::random_access_iterator_tag) [with _RandomAccessIter = __gnu_cxx::__normal_iterator<Test*, std::vector<Test, std::allocator<Test> >
, _Tp =
boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::relational_action<boost::lambda::equal_action>, boost::tuples::tuple<const int, boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2, boost::lambda::function_action<2, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (Test::*const)() const, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >]': /usr/include/c++/3.3.3/bits/stl_algo.h:298: instantiated from `_InputIter std::find(_InputIter, _InputIter, const _Tp&) [with _InputIter = __gnu_cxx::__normal_iterator<Test*, std::vector<Test, std::allocator<Test> > >, _Tp = boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::relational_action<boost::lambda::equal_action>, boost::tuples::tuple<const int, boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2, boost::lambda::function_action<2, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (Test::*const)() const, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >]' lambda2.cc:28: instantiated from here /usr/include/c++/3.3.3/bits/stl_algo.h:208: error: could not convert ` boost::lambda::operator==(const A&, const boost::lambda::lambda_functor<Arg>&) [with A = Test, Arg = boost::lambda::lambda_functor_base<boost::lambda::relational_action<boost::lambda::equal_action>, boost::tuples::tuple<const int, boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2, boost::lambda::function_action<2, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (Test::*const)() const, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> >]((+__val))' to `bool' /usr/include/c++/3.3.3/bits/stl_algo.h:298: instantiated from `_InputIter std::find(_InputIter, _InputIter, const _Tp&) [with _InputIter = __gnu_cxx::__normal_iterator<Test*, std::vector<Test, std::allocator<Test> > >, _Tp = boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::relational_action<boost::lambda::equal_action>, boost::tuples::tuple<const int, boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2, boost::lambda::function_action<2, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (Test::*const)() const, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >]' lambda2.cc:28: instantiated from here /usr/include/c++/3.3.3/bits/stl_algo.h:211: error: could not convert ` boost::lambda::operator==(const A&, const boost::lambda::lambda_functor<Arg>&) [with A = Test, Arg = boost::lambda::lambda_functor_base<boost::lambda::relational_action<boost::lambda::equal_action>, boost::tuples::tuple<const int, boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2, boost::lambda::function_action<2, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (Test::*const)() const, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> >]((+__val))' to `bool' /usr/include/c++/3.3.3/bits/stl_algo.h:214: error: could not convert ` boost::lambda::operator==(const A&, const boost::lambda::lambda_functor<Arg>&) [with A = Test, Arg = boost::lambda::lambda_functor_base<boost::lambda::relational_action<boost::lambda::equal_action>, boost::tuples::tuple<const int, boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2, boost::lambda::function_action<2, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (Test::*const)() const, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> >]((+__val))' to `bool' /usr/include/c++/3.3.3/bits/stl_algo.h:217: error: could not convert ` boost::lambda::operator==(const A&, const boost::lambda::lambda_functor<Arg>&) [with A = Test, Arg = boost::lambda::lambda_functor_base<boost::lambda::relational_action<boost::lambda::equal_action>, boost::tuples::tuple<const int, boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2, boost::lambda::function_action<2, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (Test::*const)() const, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> >]((+__val))' to `bool' /usr/include/c++/3.3.3/bits/stl_algo.h:223: error: could not convert ` boost::lambda::operator==(const A&, const boost::lambda::lambda_functor<Arg>&) [with A = Test, Arg = boost::lambda::lambda_functor_base<boost::lambda::relational_action<boost::lambda::equal_action>, boost::tuples::tuple<const int, boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2, boost::lambda::function_action<2, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (Test::*const)() const, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> >]((+__val))' to `bool' /usr/include/c++/3.3.3/bits/stl_algo.h:226: error: could not convert ` boost::lambda::operator==(const A&, const boost::lambda::lambda_functor<Arg>&) [with A = Test, Arg = boost::lambda::lambda_functor_base<boost::lambda::relational_action<boost::lambda::equal_action>, boost::tuples::tuple<const int, boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2, boost::lambda::function_action<2, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (Test::*const)() const, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> >]((+__val))' to `bool' /usr/include/c++/3.3.3/bits/stl_algo.h:229: error: could not convert ` boost::lambda::operator==(const A&, const boost::lambda::lambda_functor<Arg>&) [with A = Test, Arg = boost::lambda::lambda_functor_base<boost::lambda::relational_action<boost::lambda::equal_action>, boost::tuples::tuple<const int, boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2, boost::lambda::function_action<2, boost::lambda::detail::unspecified> >, boost::tuples::tuple<int (Test::*const)() const, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> >]((+__val))' to `bool' make: *** [lambda2.o] Error 1 Compilation exited abnormally with code 2 at Wed Jan 11 12:21:07