2015-12-22 1 views
0

Я пытаюсь в течение нескольких дней пытаться скомпилировать функцию ODEINT integrate_adaptive() внутри класса. Если я беру функцию вне класса и получаю имена общих функций, программа компилируется и работает по мере необходимости. (Из всего вывода в файл и ранее был определен)Что мне нужно сделать, чтобы функция интеграции odeint компилировалась в другом классе?

void waterbodies::writeInfo(){ 
    bulirsch_stoer_dense_out<state_type> stepper(1E-9 , 1E-9 , 1.0 , 0.0); 
    state_type x1 = { 0.0024 , 0.00001 , 0.0008,0.6,100,5,5,4,4,4,4,20000,0,10,10,100 }; // initial conditions 
    out.open(Name.c_str()); 
    out.precision(16); 
    double t = 0.0; 
    double max = 100; 
    double dt = 0.01; 
    boost::numeric::odeint::integrate_adaptive(
      rhs, 
      x1 , t , max , dt, write_rhs); 
    out.close(); 
} 

У меня есть функция, называемая шк, а другой называется 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 ) 
{} 

state_type определен в заголовке следующим образом

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); 

Если вам нужно, чтобы я что-то объяснил, просто сообщите мне, и я постараюсь сделать то, что я говорю яснее.

Благодаря

Simon

ответ

1

Этот вопрос уже ответили несколько раз:

Using boost::numeric::odeint inside the class

Вы должны связать rhs и 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);