
Hello, I really like the BLL and would like to use it as much as possible. I have run into a small problem though. My code looks like this: #include <boost/lambda/bind.hpp> #include <boost/lambda/lambda.hpp> #include <map> #include <vector> class A { public: A(int a, int b) : a_(a), b_(b) { } int a_; int b_; }; int main() { using namespace boost::lambda; std::vector<A> v; v.push_back(A(1, 2)); typedef std::map<int, int> Map; Map m; for_each(v.begin(), v.end(), bind(&Map::insert, std::make_pair(bind(&A::a_, _1), bind(&A::b_, _1)))); return 0; } What I want to do is to populate a map with the information from the vetctor v. For each element in v I want to insert a value and a key into the map something like this: void operator()(const A& a) const { m_.insert(std::make_pair(a.a_, a.b_)); } I found some information on how to use member variables as targets in the BLL documentation and that is what I have tried to use in the code above. It won't compile however, using g++ I get the following error: g++ -c -o test.o test.cpp test.cpp: In function `int main()': test.cpp:27: error: no matching function for call to `bind(<unknown type>, std::pair<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 A::*, 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::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 A::*, 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> > > >)' scons: *** [test.o] Error 1 scons: building terminated because of errors. If someone here has any ideas of how to accomplish this it would be really nice! Thanks in advance! Regards, Mattias

Hi Mattias, What you want to do is perfectly doable with BLL in my opinion. However I am not sure of the exact syntax. For now, here is what you want to do using boost::bind instead of boost::lambda::bind. The header is <boost/bind.hpp>. std::for_each(v.begin(), v.end(), boost::bind(&Map::insert, &m, boost::bind(&std::make_pair<Map::key_type, Map::mapped_type>, boost::bind(&A::a_, _1), boost::bind(&A::b_, _1)))); or std::transform(v.begin(), v.end(), std::inserter(m, m.end()), boost::bind(&std::make_pair<Map::key_type, Map::mapped_type>, boost::bind(&A::a_, _1), boost::bind(&A::b_, _1))); Both will do what you want. Cheers, -delfin
-----Original Message----- From: boost-users-bounces@lists.boost.org [mailto:boost-users- bounces@lists.boost.org] On Behalf Of Mattias Brändström Sent: Monday, August 30, 2004 1:34 AM To: boost-users@lists.boost.org Subject: [Boost-users] BLL and member variables
Hello,
I really like the BLL and would like to use it as much as possible. I have run into a small problem though. My code looks like this:
#include <boost/lambda/bind.hpp> #include <boost/lambda/lambda.hpp>
#include <map> #include <vector>
class A { public: A(int a, int b) : a_(a), b_(b) { } int a_; int b_; };
int main() { using namespace boost::lambda;
std::vector<A> v; v.push_back(A(1, 2));
typedef std::map<int, int> Map; Map m;
for_each(v.begin(), v.end(), bind(&Map::insert, std::make_pair(bind(&A::a_, _1), bind(&A::b_, _1))));
return 0; }
What I want to do is to populate a map with the information from the vetctor v. For each element in v I want to insert a value and a key into the map something like this:
void operator()(const A& a) const { m_.insert(std::make_pair(a.a_, a.b_)); }
I found some information on how to use member variables as targets in the BLL documentation and that is what I have tried to use in the code above. It won't compile however, using g++ I get the following error:
g++ -c -o test.o test.cpp test.cpp: In function `int main()': test.cpp:27: error: no matching function for call to `bind(<unknown type>,
std::pair<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 A::*, 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::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::la mbda::action<2, boost::lambda::function_action<2, boost::lambda::detail::unspecified>
, boost::tuples::tuple<int A::*, 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> > > >)' scons: *** [test.o] Error 1 scons: building terminated because of errors.
If someone here has any ideas of how to accomplish this it would be really nice!
Thanks in advance!
Regards, Mattias _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
participants (2)
-
Delfin Rojas
-
Mattias Brändström