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