C++ 我需要做什么才能使odeint集成函数在另一个类中编译?

C++ 我需要做什么才能使odeint集成函数在另一个类中编译?,c++,odeint,C++,Odeint,几天来,我一直试图在一个类中编译ODEINT的integrate_adaptive()函数。如果我将函数带到类之外,并且具有通用函数名,那么程序将根据需要编译和工作。(out只是文件的输出,是以前定义的) void waterbodies::writeInfo(){ 步进电机(1E-9、1E-9、1.0、0.0); 状态类型x1={0.0024,0.00001,0.0008,0.6100,5,5,4,4,420000,0,10,10100};//初始条件 out.open(Name.c_str(

几天来,我一直试图在一个类中编译ODEINT的integrate_adaptive()函数。如果我将函数带到类之外,并且具有通用函数名,那么程序将根据需要编译和工作。(out只是文件的输出,是以前定义的)

void waterbodies::writeInfo(){
步进电机(1E-9、1E-9、1.0、0.0);
状态类型x1={0.0024,0.00001,0.0008,0.6100,5,5,4,4,420000,0,10,10100};//初始条件
out.open(Name.c_str());
精度(16);
双t=0.0;
双倍最大值=100;
双dt=0.01;
boost::numeric::odeint::integrate\u adaptive(
rhs,
x1,t,max,dt,write_rhs);
out.close();
}
我有一个函数叫rhs,另一个函数叫write_rhs

void waterbodies::write_rhs( const state_type &x , const double t )
{
    out << t << '\t' << x[0] << '\t' << x[1] << '\t' << x[2] << '\t' << x[3] << '\t' << x[4] << '\t' << x[5] << '\t' << x[6] << '\t' << x[7] << '\t' << x[8] << '\t' << x[9] << '\t' << x[10] << '\t' << x[11] << '\t' << x[12] << '\t' << x[13] << '\t' << x[14] << '\t' << x[15] << std::endl;
}


void waterbodies::rhs( const state_type &x , state_type &dxdt , const double t  )
{}
void waterbodies::write_rhs(const state_type&x,const double t)
{

out这个问题已经被回答了好几次:

您需要将
rhs
write\u rhs
绑定到当前类:

// not tested
// the code also requires a C++14 compiler
auto rhs_wrapper = [this]( auto const& x , auto& dxdt , auto t ) {
    this->rhs( x , dxdt , t ); };
auto obs = [this]( auto const& x , auto t ) {
    this->write_rhs( x , t );
integrate_adaptive( stepper , rhs_wrapper , x , max , dt , obs );
typedef boost::array< double , 16 > state_type;
    ..\src\waterbodies.cpp: In member function 'void waterbodies::writeInfo()':
..\src\waterbodies.cpp:84:32: error: no matching function for call to 'integrate_adaptive(<unresolved overloaded function type>, waterbodies::state_type&, double&, double&, double&, <unresolved overloaded function type>)'
    x1 , t , max , dt, write_rhs);
                                ^
..\src\waterbodies.cpp:84:32: note: candidates are:
In file included from C:\software\boost_1_59_0/boost/numeric/odeint/integrate/integrate.hpp:26:0,
                 from C:\software\boost_1_59_0/boost/numeric/odeint.hpp:67,
                 from ..\src\waterbodies.cpp:4:
C:\software\boost_1_59_0/boost/numeric/odeint/integrate/integrate_adaptive.hpp:36:8: note: template<class Stepper, class System, class State, class Time, class Observer> size_t boost::numeric::odeint::integrate_adaptive(Stepper, System, State&, Time, Time, Time, Observer)
 size_t integrate_adaptive(
        ^
C:\software\boost_1_59_0/boost/numeric/odeint/integrate/integrate_adaptive.hpp:36:8: note:   template argument deduction/substitution failed:
..\src\waterbodies.cpp:84:32: note:   could not resolve address from overloaded function '((waterbodies*)this)->waterbodies::write_rhs'
    x1 , t , max , dt, write_rhs);
                                ^
In file included from C:\software\boost_1_59_0/boost/numeric/odeint/integrate/integrate.hpp:26:0,
                 from C:\software\boost_1_59_0/boost/numeric/odeint.hpp:67,
                 from ..\src\waterbodies.cpp:4:
C:\software\boost_1_59_0/boost/numeric/odeint/integrate/integrate_adaptive.hpp:60:8: note: template<class Stepper, class System, class State, class Time, class Observer> size_t boost::numeric::odeint::integrate_adaptive(Stepper, System, const State&, Time, Time, Time, Observer)
 size_t integrate_adaptive(
        ^
C:\software\boost_1_59_0/boost/numeric/odeint/integrate/integrate_adaptive.hpp:60:8: note:   template argument deduction/substitution failed:
..\src\waterbodies.cpp:84:32: note:   could not resolve address from overloaded function '((waterbodies*)this)->waterbodies::write_rhs'
    x1 , t , max , dt, write_rhs);
                                ^
In file included from C:\software\boost_1_59_0/boost/numeric/odeint/integrate/integrate.hpp:26:0,
                 from C:\software\boost_1_59_0/boost/numeric/odeint.hpp:67,
                 from ..\src\waterbodies.cpp:4:
C:\software\boost_1_59_0/boost/numeric/odeint/integrate/integrate_adaptive.hpp:79:8: note: template<class Stepper, class System, class State, class Time> size_t boost::numeric::odeint::integrate_adaptive(Stepper, System, State&, Time, Time, Time)
 size_t integrate_adaptive(
        ^
C:\software\boost_1_59_0/boost/numeric/odeint/integrate/integrate_adaptive.hpp:79:8: note:   template argument deduction/substitution failed:
..\src\waterbodies.cpp:84:32: note:   could not resolve address from overloaded function '((waterbodies*)this)->waterbodies::write_rhs'
    x1 , t , max , dt, write_rhs);
                                ^
In file included from C:\software\boost_1_59_0/boost/numeric/odeint/integrate/integrate.hpp:26:0,
                 from C:\software\boost_1_59_0/boost/numeric/odeint.hpp:67,
                 from ..\src\waterbodies.cpp:4:
C:\software\boost_1_59_0/boost/numeric/odeint/integrate/integrate_adaptive.hpp:91:8: note: template<class Stepper, class System, class State, class Time> size_t boost::numeric::odeint::integrate_adaptive(Stepper, System, const State&, Time, Time, Time)
 size_t integrate_adaptive(
        ^
C:\software\boost_1_59_0/boost/numeric/odeint/integrate/integrate_adaptive.hpp:91:8: note:   template argument deduction/substitution failed:
..\src\waterbodies.cpp:84:32: note:   could not resolve address from overloaded function '((waterbodies*)this)->waterbodies::write_rhs'
    x1 , t , max , dt, write_rhs);
// not tested
// the code also requires a C++14 compiler
auto rhs_wrapper = [this]( auto const& x , auto& dxdt , auto t ) {
    this->rhs( x , dxdt , t ); };
auto obs = [this]( auto const& x , auto t ) {
    this->write_rhs( x , t );
integrate_adaptive( stepper , rhs_wrapper , x , max , dt , obs );