function,bind1st和mem_fun [英] functional, bind1st and mem_fun

查看:119
本文介绍了function,bind1st和mem_fun的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么不编译?

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

class A { 
    A() { 
        typedef boost::function<void ()> FunctionCall; 
        FunctionCall f = std::bind1st(std::mem_fun(&A::process), this); 
    } 
    void process() {} 
};

错误:

In file included from /opt/local/include/gcc44/c++/bits/stl_function.h:712,
                 from /opt/local/include/gcc44/c++/functional:50,
                 from a.cc:1:
/opt/local/include/gcc44/c++/backward/binders.h: In instantiation of 'std::binder1st<std::mem_fun_t<void, A> >':
a.cc:7:   instantiated from here
/opt/local/include/gcc44/c++/backward/binders.h:100: error: no type named 'second_argument_type' in 'class std::mem_fun_t<void, A>'
/opt/local/include/gcc44/c++/backward/binders.h:103: error: no type named 'first_argument_type' in 'class std::mem_fun_t<void, A>'
/opt/local/include/gcc44/c++/backward/binders.h:106: error: no type named 'first_argument_type' in 'class std::mem_fun_t<void, A>'
/opt/local/include/gcc44/c++/backward/binders.h:111: error: no type named 'second_argument_type' in 'class std::mem_fun_t<void, A>'
/opt/local/include/gcc44/c++/backward/binders.h:117: error: no type named 'second_argument_type' in 'class std::mem_fun_t<void, A>'
/opt/local/include/gcc44/c++/backward/binders.h: In function 'std::binder1st<_Operation> std::bind1st(const _Operation&, const _Tp&) [with _Operation = std::mem_fun_t<void, A>, _Tp = A*]':
a.cc:7:   instantiated from here
/opt/local/include/gcc44/c++/backward/binders.h:126: error: no type named 'first_argument_type' in 'class std::mem_fun_t<void, A>'
In file included from /opt/local/include/boost/function/detail/maybe_include.hpp:13,
                 from /opt/local/include/boost/function/detail/function_iterate.hpp:14,
                 from /opt/local/include/boost/preprocessor/iteration/detail/iter/forward1.hpp:47,
                 from /opt/local/include/boost/function.hpp:64,
                 from a.cc:2:
/opt/local/include/boost/function/function_template.hpp: In static member function 'static void boost::detail::function::void_function_obj_invoker0<FunctionObj, R>::invoke(boost::detail::function::function_buffer&) [with FunctionObj = std::binder1st<std::mem_fun_t<void, A> >, R = void]':
/opt/local/include/boost/function/function_template.hpp:913:   instantiated from 'void boost::function0<R>::assign_to(Functor) [with Functor = std::binder1st<std::mem_fun_t<void, A> >, R = void]'
/opt/local/include/boost/function/function_template.hpp:722:   instantiated from 'boost::function0<R>::function0(Functor, typename boost::enable_if_c<boost::type_traits::ice_not::value, int>::type) [with Functor = std::binder1st<std::mem_fun_t<void, A> >, R = void]'
/opt/local/include/boost/function/function_template.hpp:1064:   instantiated from 'boost::function<R()>::function(Functor, typename boost::enable_if_c<boost::type_traits::ice_not::value, int>::type) [with Functor = std::binder1st<std::mem_fun_t<void, A> >, R = void]'
a.cc:7:   instantiated from here
/opt/local/include/boost/function/function_template.hpp:153: error: no match for call to '(std::binder1st<std::mem_fun_t<void, A> >) ()'


推荐答案

因为 bind1st 需要一个二进制函数对象。但是你传递一个一元函数对象。 C ++ 03的函数对象绑定不像boost或tr1中那样复杂。事实上,他们遭受基本问题,如不能处理带参考参数的函数。

Because bind1st requires a binary function object. However you pass an unary function object. The function object binders of C++03 aren't as sophisticated as the one found in boost or tr1. In fact, they suffer from basic problems like not being able to handle functions with reference parameters.

由于您已使用boost,我建议使用 boost :: bind

Since you already use boost, i recommend to use boost::bind

FunctionCall f = boost::bind(&A::process, this); // yay!

这篇关于function,bind1st和mem_fun的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆