Compilation/syntax error Boost.Lambda

Hi, The code below does not compile and gives me 2 errors that, whatever I try, do not want to disappear. What am I doing wrong? TIA The errors: g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"Main.d" -MT"Main.d" -o"Main.o" "../Main.cpp" ../Main.cpp: In function ‘std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > getObjects(const Predicate&)’: ../Main.cpp:34: error: no matching function for call to ‘bind(<unresolved overloaded function type>, std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*&, 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<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::* 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::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2, boost::lambda::function_action<2, boost::lambda::detail::unspecified> >, boost::tuples::tuple<std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::* 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> > > >&)’ ../Main.cpp: In function ‘int main(int, char**)’: ../Main.cpp:46: error: no match for ‘operator<<’ in ‘boost::lambda::operator<<(A&, const boost::lambda::lambda_functor<Arg>&) [with A = std::ostream, Arg = boost::lambda::lambda_functor_base<boost::lambda::action<2, boost::lambda::function_action<2, boost::lambda::detail::unspecified> >, boost::tuples::tuple<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::* 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> >](((const 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<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::* 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::lambda::bind(const Arg1&, const Arg2&) [with Arg1 = const std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::*, Arg2 = boost::lambda::lambda_functor<boost::lambda::placeholder<1> >](((const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >&)((const boost::lambda::placeholder1_type*)boost::lambda::<unnamed>::_1)))))) << std::endl’ ../Main.cpp: In function ‘std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > getObjects(const Predicate&) [with Predicate = boost::function<bool(std::string)>]’: ../Main.cpp:45: instantiated from here ../Main.cpp:28: error: no matching function for call to ‘bind(<unresolved overloaded function type>, std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*, 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<const std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::* 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::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<2, boost::lambda::function_action<2, boost::lambda::detail::unspecified> >, boost::tuples::tuple<std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::* 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> > > >)’ make: *** [Main.o] Error 1 The code: #include <iostream> #include <map> #include <boost/lambda/lambda.hpp> #include <boost/lambda/algorithm.hpp> #include <boost/lambda/bind.hpp> #include <boost/lambda/if.hpp> #include <boost/function.hpp> using namespace std; using namespace boost; using namespace boost::lambda; map<string, string> objects; template< typename Predicate > map<string, string> getObjects( const Predicate& aPredicate) { map<string, string> matchedObjects; for_each( objects.begin(), objects.end(), if_then( bind(aPredicate, boost::lambda::_1) , bind(&map<string, string>::insert, &matchedObjects , make_pair(bind(&map<string, string>::value_type::first, _1),bind(&map<string, string>::value_type::second,_1))))); return matchedObjects; } int main( int argc, char* argv[]) { objects.insert(make_pair("one","value")); objects.insert(make_pair("two","value")); objects.insert(make_pair("three","value")); function< bool (string)> predicate = _1 == "value"; map<string, string> matchedObjects = getObjects(predicate); for_each(matchedObjects.begin(),matchedObjects.end(),cout << bind(&map<string, string>::value_type::first, _1) << endl); } -- Groeten, Joost Kraaijeveld Askesis B.V. Molukkenstraat 14 6524NB Nijmegen tel: 024-3888063 / 06-51855277 fax: 024-3608416 web: www.askesis.nl

AMDG Joost Kraaijeveld wrote:
The code below does not compile and gives me 2 errors that, whatever I try, do not want to disappear. What am I doing wrong?
The errors:
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"Main.d" -MT"Main.d" -o"Main.o" "../Main.cpp" ../Main.cpp: In function ‘std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > getObjects(const Predicate&)’: ../Main.cpp:34: error: no matching function for call to ‘bind(<unresolved overloaded function type>,
<snip>
bind(&map<string, string>::insert,
insert is overloaded and the compiler doesn't know which one you mean. You'll need to cast it to the right type. See also http://www.gotw.ca/gotw/064.htm In Christ, Steven Watanabe

On Fri, 2010-02-05 at 07:50 -0800, Steven Watanabe wrote:
bind(&map<string, string>::insert,
insert is overloaded and the compiler doesn't know which one you mean. You'll need to cast it to the right type. See also http://www.gotw.ca/gotw/064.htm Based on your answer and the Boost lambda docs (http://www.boost.org/doc/libs/1_42_0/doc/html/lambda/le_in_details.html#lamb...) I changed the code to: ... template< typename Predicate > map<string, string> getObjectsFromMap( const Predicate& aPredicate) { pair< map< string, string >::iterator, bool > (*InsertFn)(const map<string, string>::value_type&) = &map<string, string>::insert; map<string, string> matchedObjects; for_each( objectsMap.begin(), objectsMap.end(), if_then( bind(aPredicate, _1) , bind(InsertFn, &matchedObjects , make_pair(bind(&map<string, string>::value_type::first, _1),bind(&map<string, string>::value_type::second,_1))))); return matchedObjects; }
But that gives me more errors than I could imagine. Could you give me a bit more info as I am really lost here. TIA -- Groeten, Joost Kraaijeveld Askesis B.V. Molukkenstraat 14 6524NB Nijmegen tel: 024-3888063 / 06-51855277 fax: 024-3608416 web: www.askesis.nl

AMDG Joost Kraaijeveld wrote:
On Fri, 2010-02-05 at 07:50 -0800, Steven Watanabe wrote:
bind(&map<string, string>::insert,
insert is overloaded and the compiler doesn't know which one you mean. You'll need to cast it to the right type. See also http://www.gotw.ca/gotw/064.htm
Based on your answer and the Boost lambda docs (http://www.boost.org/doc/libs/1_42_0/doc/html/lambda/le_in_details.html#lamb...) I changed the code to: ... template< typename Predicate > map<string, string> getObjectsFromMap( const Predicate& aPredicate) { pair< map< string, string >::iterator, bool > (*InsertFn)(const map<string, string>::value_type&) = &map<string, string>::insert;
Try pair<...> (map<string, string>::* InsertFn)(const map<...>::value_type&) = ...;
map<string, string> matchedObjects; for_each( objectsMap.begin(), objectsMap.end(), if_then( bind(aPredicate, _1) , bind(InsertFn, &matchedObjects , make_pair(bind(&map<string, string>::value_type::first, _1),bind(&map<string, string>::value_type::second,_1))))); return matchedObjects; }
But that gives me more errors than I could imagine. Could you give me a bit more info as I am really lost here.
In Christ, Steven Watanabe

Thanks to Steven and my own thinking a solution: #include <iostream> #include <map> #include <boost/lambda/lambda.hpp> #include <boost/lambda/algorithm.hpp> #include <boost/lambda/bind.hpp> #include <boost/lambda/if.hpp> #include <boost/function.hpp> #include <functional> template< typename Key, typename Value, typename Predicate > std::map< Key, Value > copy_if( const std::map< Key, Value >& aMap, const Predicate& aPredicate) { using namespace std; using namespace boost::lambda; pair< typename map< Key, Value >::iterator, bool > (map< Key, Value >::*InsertFn)(const typename map< Key, Value >::value_type&) = &map< Key, Value >::insert; map<Key, Value > matchedObjects; for_each( aMap.begin(), aMap.end(), if_then( bind( aPredicate, _1), bind( InsertFn, &matchedObjects , bind( &make_pair< typename std::map < Key, Value >::key_type,typename map< Key, Value >::mapped_type >, bind(&map< Key, Value >::value_type::first, _1), bind(&map< Key, Value >::value_type::second,_1))))); return matchedObjects; } int main( int argc, char* argv[]) { std::map<std::string, std::string> objectsMap; objectsMap.insert(std::make_pair("one","value1")); objectsMap.insert(std::make_pair("two","value2")); objectsMap.insert(std::make_pair("three","value3")); boost::function< bool (std::map<std::string, std::string>::value_type)> mapPredicate = boost::lambda::bind(&std::map<std::string, std::string>::value_type::second,boost::lambda::_1) == "value3"; std::map<std::string, std::string> matchedObjectsMap = copy_if(objectsMap,mapPredicate); std::for_each( matchedObjectsMap.begin(), matchedObjectsMap.end(), std::cout << boost::lambda::bind(&std::map<std::string, std::string>::value_type::first, boost::lambda::_1) << boost::lambda::constant(" ") << boost::lambda::bind(&std::map<std::string, std::string>::value_type::second, boost::lambda::_1) << '\n'); return 0; } -- Groeten, Joost Kraaijeveld Askesis B.V. Molukkenstraat 14 6524NB Nijmegen tel: 024-3888063 / 06-51855277 fax: 024-3608416 web: www.askesis.nl
participants (2)
-
Joost Kraaijeveld
-
Steven Watanabe