使用boost :: function和boost :: bind

时间:2015-12-10 19:34:50

标签: c++ boost

我有以下代码尝试将非静态成员函数作为替代想法传递给需要函数指针的旧c代码。它没有编译。你能帮忙吗?有些东西必须明显,我是新手。提前致谢。 - 金平

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


using namespace boost;
using namespace std;

double addTest( boost::function<double (double)> f, double a, double x )
{

    double a1 = f(a);

    double a2= a1+x;

    return a2;
}

double squareIt (double x) {
    return x*x;
}

class X {
public:
    X(double x0, double x1){ x=x0+x1; }

    double plusIt(double t) { return x+t; }
private:

    double x;

};
int main (int argc, char** argv)
{
    boost::function<double (double)> f;
    f = &squareIt;

    double result = addTest(f, 10, 5);   //OK

    cout << "result = " << result << endl;

    X newx(10, 15);

    //f=boost::bind(&X::plusIt, &newx);   // does not complie
    double res2 = addTest(boost::bind(&X::plusIt, &newx), 10, 5);  // does  not compile

    cout << "result2 = " << res2 << endl;

    return 0;
}

//编译错误:

g ++ -Wall -g -O0 -I / meth_mount / utility_sys / boost_1_42_0 / -I / usr / include -I / meth_mount / utility_sys / gsl-1.15 / -I / home / ayuan / work / ird_lib / core_lib / alib / intrface / build / alib / clib / linux -DUNIX -DSET_ENVIRONMENT -DOPTION_RESET -c ./../src/BindTest.cpp /meth_mount/utility_sys/boost_1_42_0/boost/function/function_template.hpp:在静态成员函数中 - 静态R boost :: detail :: function :: function_obj_invoker1 :: invoke(boost :: detail :: function :: function_buffer&amp ;, T0)[与FunctionObj = boost :: _ bi :: bind_t,boost :: _ bi :: list1&gt; &gt;,R = double,T0 = double]â€: /meth_mount/utility_sys/boost_1_42_0/boost/function/function_template.hpp:913:从'void boost :: function1 :: assign_to(Functor)实例化[与Functor = boost :: _ bi :: bind_t,boost :: _ bi: :list1&gt; &gt ;, R = double,T0 = double]†/meth_mount/utility_sys/boost_1_42_0/boost/function/function_template.hpp:722:从~boost :: function1 :: function1实例化(Functor,typename boost :: enable_if_c :: value&gt; :: value,int&gt; :: type )[与Functor = boost :: _ bi :: bind_t,boost :: _ bi :: list1&gt; &gt ;, R = double,T0 = double]†/meth_mount/utility_sys/boost_1_42_0/boost/function/function_template.hpp:1064:从~boost :: function :: function实例化(Functor,typename boost :: enable_if_c :: value&gt; :: value,int&gt; :: type )[与Functor = boost :: _ bi :: bind_t,boost :: _ bi :: list1&gt; &gt ;, R = double,T0 = double]†./../src/BindTest.cpp:46:从这里实例化 /meth_mount/utility_sys/boost_1_42_0/boost/function/function_template.hpp:132:错误:无法将“双重()(双倍)”转换为“双重”作为回报 /meth_mount/utility_sys/boost_1_42_0/boost/bind/mem_fn.hpp:在成员函数“R&amp; boost :: _ mfi :: dm :: operator()(T )const [with R = double()(double),T = X]â€: /meth_mount/utility_sys/boost_1_42_0/boost/bind/bind.hpp:243:从“R boost :: _ bi :: list1 :: operator()实例化”(boost :: _ bi :: type,F&amp;,A&amp;, long int)[with R = double(&amp;)(double),F = boost :: _ mfi :: dm,A = boost :: _ bi :: list1,A1 = boost :: _ bi :: value]’ /meth_mount/utility_sys/boost_1_42_0/boost/bind/bind_template.hpp:32:从“ofpename boost :: _ bi :: result_traits :: type boost :: _ bi :: bind_t :: operator()(A1&amp;)[实例化] [ A1 = double,R = double(&amp;)(double),F = boost :: _ mfi :: dm,L = boost :: _ bi :: list1&gt;] /meth_mount/utility_sys/boost_1_42_0/boost/function/function_template.hpp:132:从“静态R boost :: detail :: function :: function_obj_invoker1 :: invoke”实例化(boost :: detail :: function :: function_buffer&amp ;, T0)[与FunctionObj = boost :: _ bi :: bind_t,boost :: _ bi :: list1&gt; &gt ;, R = double,T0 = double]†/meth_mount/utility_sys/boost_1_42_0/boost/function/function_template.hpp:913:从'void boost :: function1 :: assign_to(Functor)实例化[与Functor = boost :: _ bi :: bind_t,boost :: _ bi: :list1&gt; &gt ;, R = double,T0 = double]†/meth_mount/utility_sys/boost_1_42_0/boost/function/function_template.hpp:722:从~boost :: function1 :: function1实例化(Functor,typename boost :: enable_if_c :: value&gt; :: value,int&gt; :: type )[与Functor = boost :: _ bi :: bind_t,boost :: _ bi :: list1&gt; &gt ;, R = double,T0 = double]†/meth_mount/utility_sys/boost_1_42_0/boost/function/function_template.hpp:1064:从~boost :: function :: function实例化(Functor,typename boost :: enable_if_c :: value&gt; :: value,int&gt; :: type )[与Functor = boost :: _ bi :: bind_t,boost :: _ bi :: list1&gt; &gt ;, R = double,T0 = double]†./../src/BindTest.cpp:46:从这里实例化 /meth_mount/utility_sys/boost_1_42_0/boost/bind/mem_fn.hpp:342:错误:无效使用非静态成员函数 make:*** [../bin/BindTest.o]错误1

1 个答案:

答案 0 :(得分:5)

您缺少必需的_1,因为X::plusIt是一元函数(不包括this)。正确的代码是

double res2 = addTest(boost::bind(&X::plusIt, &newx, _1), 10, 5);

另见Using bind with pointers to members