我有以下代码尝试将非静态成员函数作为替代想法传递给需要函数指针的旧c代码.它没有编译.你能帮忙吗?有些东西必须明显,我是新手.提前致谢. - 金平
#include#include #include #include using namespace boost; using namespace std; double addTest( boost::function 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 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&,T0)[with FunctionObj = boost :: _ bi :: bind_t,boost :: _ bi :: list1 >>,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 >>,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> :: value,int> :: type)[wit h Functor = boost :: _ bi :: bind_t,boost :: _ bi :: list1 >>,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> :: value,int> :: type)[with Functor = boost :: _ bi :: bind_t,boost :: _ bi: :list1 >>,R = double,T0 = double] ./../src/BindTest.cpp:46:从这里实例化/meth_mount/utility_sys/boost_1_42_0/boost/function/function_template.hpp:132:error :无法将'double()(double)转换为' double'并返回/meth_mount/utility_sys/boost_1_42_0/boost/bind/mem_fn.hpp:在成员函数中--R&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&,A&,long int)[with R = double(&)(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&)[A1 = double,R = double(&)(double),F = boost :: _ mfi :: dm,L = boost :: _ bi :: list1>]â€/ 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&,T0) [使用FunctionObj = boost :: _ bi :: bind_t,boost :: _ bi :: list1 >>,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 >>,R = double,T0 = double]â€/ meth_mount/utility_sys/boost_1_42_0/boost/function/function_template.hpp:722:从'boost :: function1 :: function1实例化(Functor,typename嘘声)t :: enable_if_c :: value> :: value,int> :: type)[with Functor = boost :: _ bi :: bind_t,boost :: _ bi :: list1 >>,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> :: value,int> :: type)[with Functor = boost :: _ bi :: bind_t,boost :: _ bi :: list1 >>,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
这是必需的,因为它X::plusIt
是一元函数(不算数this
).正确的代码是
double res2 = addTest(boost::bind(&X::plusIt, &newx, _1), 10, 5);
另请参见将bind与指向成员的指针配合使用.