Given: #include <map> #include <boost/mem_fn.hpp> #include <boost/function.hpp> #include <boost/lambda/lambda.hpp> #include <boost/lambda/bind.hpp> using namespace std; using namespace boost; using namespace boost::lambda; struct s { int key (){return 1;} int value(){return 2;} }; typedef map<int, int> int_map; int_map m; var_type<int_map>::type delayed_m(var(m)); template<class F> void execute(F f) { s o; f(o); } Why does this work?: int main() { execute ( delayed_m[lambda::bind(&s::key, lambda::_1)] = lambda::bind(&s::value, lambda::_1) ); } But this doesn’t?: int main() { function<int (s &)> key (mem_fn(&s::key )), value(mem_fn(&s::value)); execute ( delayed_m[key] = value //compile error instantiation backtrace leads to here ); } I’m using VC7.1. Here's the error (sorry that it's so noisy): c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\boost\lambda\detail\operator_lambda_func_base.hpp(255) : error C2440: '=' : cannot convert from 'const boost::tuples::cons<HT,TT>::stored_head_type' to 'int' with [ HT=const boost::lambda::detail::parameter_traits_<const boost::function<int (s &)>,const boost::lambda::detail::IF<false,const boost::function<int (s &)> &,const boost::function<int (s &)>>::RET>::type, TT=boost::tuples::detail::map_tuple_to_cons<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>::type ] No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\boost\lambda\detail\lambda_functors.hpp(153) : see reference to function template instantiation 'RET boost::lambda::lambda_functor_base<Act,Args>::call<boost::lambda::lambda_functor_base<Act,Args>::sig<SigArgs>::type,A,const boost::tuples::null_type,const boost::tuples::null_type,const boost::tuples::null_type>(A &,B &,C &,Env &) const' being compiled with [ RET=boost::lambda::lambda_functor_base<boost::lambda::other_action<boost::lambda::assignment_action>,boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::other_action<boost::lambda::subscript_action>,boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::identity<int_map &>>,const boost::lambda::detail::parameter_traits_<const boost::function<int (s &)>,const boost::lambda::detail::IF<false,const boost::function<int (s &)> &,const boost::function<int (s &)>>::RET>::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>>>,const boost::lambda::detail::parameter_traits_<const boost::function<int (s &)>,const boost::lambda::detail::IF<false,const boost::function<int (s &)> &,const boost::function<int (s &)>>::RET>::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>>::sig<boost::tuples::tuple<s &,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>>::type, Act=boost::lambda::other_action<boost::lambda::assignment_action>, Args=boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boos t::lambda::other_action<boost::lambda::subscript_action>,boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::identity<int_map &>>,const boost::lambda::detail::parameter_traits_<const boost::function<int (s &)>,const boost::lambda::detail::IF<false,const boost::function<int (s &)> &,const boost::function<int (s &)>>::RET>::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>>>,const boost::lambda::detail::parameter_traits_<const boost::function<int (s &)>,const boost::lambda::detail::IF<false,const boost::function<int (s &)> &,const boost::function<int (s &)>>::RET>::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>, SigArgs=boost::tuples::tuple<s &,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>, A=s, B=const boost::tuples::null_type, C=const boost::tuples::null_type, Env=const boost::tuples::null_type ] c:\TestApps\GeneralTests\GeneralTests.cpp(27) : see reference to function template instantiation 'boost::lambda::lambda_functor_base<Act,Args>::sig<SigArgs>::type boost::lambda::lambda_functor<T>::operator ()<s>(A &) const' being compiled with [ Act=boost::lambda::other_action<boost::lambda::assignment_action>, Args=boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::other_action<boost::lambda::subscript_action>,boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::identity<int_map &>>,const boost::lambda::detail::parameter_traits_<const boost::function<int (s &)>,const boost::lambda::detail::IF<false,const boost::function<int (s &)> &,const boost::function<int (s &)>>::RET>::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>>>,const boost::lambda::detail::parameter_traits_<const boost::function<int (s &)>,const boost::lambda::detail::IF<false,const boost::function<int (s &)> &,const boost::function<int (s &)>>::RET>::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>, SigArgs=boost::tuples::tuple<s &,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>, T=boost::lambda::lambda_functor_base<boost::lambda::other_action<boost::lambda::assignment_action>,boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::other_action<boost::lambda::subscript_action>,boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::identity<int_map &>>,const boost::lambda::detail: :parameter_traits_<const boost::function<int (s &)>,const boost::lambda::detail::IF<false,const boost::function<int (s &)> &,const boost::function<int (s &)>>::RET>::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>>>,const boost::lambda::detail::parameter_traits_<const boost::function<int (s &)>,const boost::lambda::detail::IF<false,const boost::function<int (s &)> &,const boost::function<int (s &)>>::RET>::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>>, A=s ] c:\TestApps\GeneralTests\GeneralTests.cpp(47) : see reference to function template instantiation 'void Execute<boost::lambda::lambda_functor<T>>(F)' being compiled with [ T=boost::lambda::lambda_functor_base<boost::lambda::other_action<boost::lambda::assignment_action>,boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::other_action<boost::lambda::subscript_action>,boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::identity<int_map &>>,const boost::lambda::detail::parameter_traits_<const boost::function<int (s &)>,const boost::lambda::detail::IF<false,const boost::function<int (s &)> &,const boost::function<int (s &)>>::RET>::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>>>,const boost::lambda::detail::parameter_traits_<const boost::function<int (s &)>,const boost::lambda::detail::IF<false,const boost::function<int (s &)> &,const boost::function<int (s &)>>::RET>::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>>, F=boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::other_action<boost::lambda::assignment_action>,boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::other_action<boost::lambda::subscript_action>,boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::identity<int_map &>>,const boost::lambda::detail::parameter_traits_<const boost::function<int (s &)>,const boost::lambda::detail::IF<false,const boost::function<int (s &)> &,const boost::function<int (s &)>>::RET>::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>>>,const boost::lambda::detail::parameter_traits_<const boost::function<int (s &)>,const boost::lambda::detail::IF<false,const boost::function<int (s &)> &,const boost::function<int (s &)>>::RET>::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>>> ]