2

我正在尝试odeint在一个类中使用(即用于求解微分方程的库),但我不能。我真的需要把它放在一个类中,这样我就可以控制我的项目。这是我得到的错误error C3867: 'robot::sys': function call missing argument list; use '&robot::sys' to create a pointer to member

这是我的代码

#include <iostream>
#include <boost/numeric/odeint.hpp>

using namespace std;
using namespace boost::numeric::odeint;

/* The type of container used to hold the state vector */
typedef std::vector< double > state_type;

class robot
{
    double g, dt, t;
    runge_kutta_dopri5<state_type> stepper;

public:
    state_type x;

    robot() : x(2)
    {
        x[0] = 1.0;
        x[1] = 0.0;
        t = 0;
        g = 0.15;
        dt = 0.1;
    }

    void move();
    void sys(const state_type &x, state_type &dx,  double t);
};


void robot::move()
{
    stepper.do_step(sys , x , t, dt );
    t += dt;
}


void robot::sys( const state_type &x , state_type &dx ,  double t )
{
    dx[0] =  x[1];
    dx[1] = -x[0] - g*x[1];
}



int main(int argc, char **argv)
{
   robot Robo;

   for ( size_t i(0); i < 100; ++i){
       Robo.move();
   }


    return 0;
}

当我尝试错误消息中建议的解决方案时,我收到另一个错误,即

....\odeint\stepper\base\explicit_error_stepper_fsal_base.hpp(279): error C2064: term does not evaluate to a function taking 3 arguments

4

2 回答 2

4

sys是一个非静态成员函数;它们的行为不像普通函数,因为它们有一个隐式this参数。

可能的修复是:

(1) 使用 C++11 lambda 代替sys

void robot::move()
{
    stepper.do_step([this](const state_type &x, state_type &dx, double t){
        dx[0] =  x[1];
        dx[1] = -x[0] - g*x[1];
    }, x , t, dt );
    t += dt;
}

(2) 保存sys和使用std::bindboost::bind

void robot::move()
{
    using namespace std::placeholders;
    stepper.do_step(std::bind(&robot::sys, this, _1, _2, _3), x , t, dt );
    t += dt;
}

(3) 使用自定义编写的仿函数代替sys

struct System {
    double g;
    explicit System(double g) : g(g) {}
    void operator()( const state_type &x , state_type &dx ,  double t )
    {
        dx[0] =  x[1];
        dx[1] = -x[0] - g*x[1];
    }
};

void robot::move()
{
    stepper.do_step(System(g), x , t, dt );
    t += dt;
}

请注意,在这种情况下,您可以让您的类存储一个System对象,而不是g在每次调用move.

于 2014-11-26T09:47:29.017 回答
1

您的 move 函数将 sys 作为参数传递,编译器为此建议正确的语法。您可以在 move 函数中将 sys 替换为适当的 lambda 表达式或使用 bind。

http://en.cppreference.com/w/cpp/utility/functional/bind

http://www.cprogramming.com/c++11/c++11-lambda-closures.html

于 2014-11-26T09:25:15.147 回答