I'm having trouble compiling some very simple boost::function and boost::bind code under Xcode 4.4.1 using the default Apple LLVM compiler 4.0. I've simplified the code down to:

#include <boost/bind.hpp>
#include <boost/function.hpp>

struct Monitor {
    void Change(int a, int b);

    

    void Lose() {
        auto b = boost::bind(&Monitor::Change, this);
        boost::function<void (int, int)> f(b);
    }
};

On the second line of the Lose() function I get the error "reference to non-static member function must be called". The full error message is below.

I haven't been able to figure out just where the problem is. Is this an incompatibility between Boost 1.50 and Xcode 4.4.1, or am I making some other mistake? Is there a straightforward workaround?

Thanks,

—Stuart



In file included from /Users/samalone/Projects/functionbind/functionbind/main.cpp:1:
In file included from /Users/samalone/Boost/boost/bind.hpp:22:
In file included from /Users/samalone/Boost/boost/bind/bind.hpp:26:
In file included from /Users/samalone/Boost/boost/mem_fn.hpp:22:
/Users/samalone/Boost/boost/bind/mem_fn.hpp:342:16: error: reference to non-static member function must be called
        return (p->*f_);
               ^~~~~~~~
/Users/samalone/Boost/boost/bind/bind.hpp:243:16: note: in instantiation of member function 'boost::_mfi::dm<void (int, int), Monitor>::operator()' requested here
        return unwrapper<F>::unwrap(f, 0)(a[base_type::a1_]);
               ^
/Users/samalone/Boost/boost/bind/bind_template.hpp:61:27: note: in instantiation of function template specialization 'boost::_bi::list1<boost::_bi::value<Monitor *> >::operator()<void (&)(int, int), boost::_mfi::dm<void (int, int), Monitor>, boost::_bi::list2<int &, int &> >' requested here
        BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
                          ^
/Users/samalone/Boost/boost/function/function_template.hpp:153:33: note: in instantiation of function template specialization 'boost::_bi::bind_t<void (&)(int, int), boost::_mfi::dm<void (int, int), Monitor>, boost::_bi::list1<boost::_bi::value<Monitor *>> >::operator()<int, int>' requested here
          BOOST_FUNCTION_RETURN((*f)(BOOST_FUNCTION_ARGS));
                                ^
/Users/samalone/Boost/boost/function/function_template.hpp:75:36: note: expanded from macro 'BOOST_FUNCTION_RETURN'
#  define BOOST_FUNCTION_RETURN(X) X
                                   ^
/Users/samalone/Boost/boost/function/function_template.hpp:907:53: note: in instantiation of member function 'boost::detail::function::void_function_obj_invoker2<boost::_bi::bind_t<void (&)(int, int), boost::_mfi::dm<void (int, int), Monitor>, boost::_bi::list1<boost::_bi::value<Monitor *>>>, void, int, int>::invoke' requested here
        { { &manager_type::manage }, &invoker_type::invoke };
                                                    ^
/Users/samalone/Boost/boost/function/function_template.hpp:722:13: note: in instantiation of function template specialization 'boost::function2<void, int, int>::assign_to<boost::_bi::bind_t<void (&)(int, int), boost::_mfi::dm<void (int, int), Monitor>, boost::_bi::list1<boost::_bi::value<Monitor *>>> >' requested here
      this->assign_to(f);
            ^
/Users/samalone/Boost/boost/function/function_template.hpp:1042:5: note: in instantiation of function template specialization 'boost::function2<void, int, int>::function2<boost::_bi::bind_t<void (&)(int, int), boost::_mfi::dm<void (int, int), Monitor>, boost::_bi::list1<boost::_bi::value<Monitor *>>> >' requested here
    base_type(f)
    ^
/Users/samalone/Projects/functionbind/functionbind/main.cpp:9:42: note: in instantiation of function template specialization 'boost::function<void (int, int)>::function<boost::_bi::bind_t<void (&)(int, int), boost::_mfi::dm<void (int, int), Monitor>, boost::_bi::list1<boost::_bi::value<Monitor *>>> >' requested here
        boost::function<void (int, int)> f(b);
                                         ^
1 error generated.