FLTK按钮回调给出c3867

FLTK button callback gives c3867

本文关键字:c3867 回调 按钮 FLTK      更新时间:2023-10-16

我试图用一个我以前尝试过的方法将函数分配给一个按钮,这个方法以前也有效,但由于某种原因,我现在从编译器那里得到了这个:

错误C3867:"WindowReq::calc_cb":非标准语法;使用"&"到创建指向成员的指针

这是代码:

class WindowReq : public Fl_Window
{
public:
    WindowReq(int W, int H, const char* Title);
    Fl_Input*   InVel;
    Fl_Input*   InDeg;
    Fl_Button*  Calc;

private:
    void calc_cb(Fl_Widget* o, void* v);
};

WindowReq::WindowReq(int W, int H, const char* Title) : Fl_Window(W, H, Title)
{
    begin();
        Calc = new Fl_Button((WINSIZE - 150), 50, 100, 30, "Calculate path");
        Calc->callback(calc_cb, this);
        InVel = new Fl_Input(70, 50, 100, 30, "Velocity:");
        InDeg = new Fl_Input(((WINSIZE / 3) + 50), 50, 100, 30, "Angle:");
    end();

    show();
}

我不知道问题出在哪里,如果有任何帮助,我们将不胜感激。

编辑:这是根据VisualStudio:导致错误的行

Calc->callback(calc_cb, this);

不能像这样调用实例化方法
函数必须而不是依赖于类的实例。

因此,基本上您有多种选择来绕过这一点,但由于您将this作为第二个参数传递,我想您只是忘记了calc_cb声明之前的static关键字。

然后通话应该看起来像:

Calc->callback(&WindowReq::calc_cb, this);

其他方法包括使用模板化回调或C++11的lambda,它们可以直接在实例化类中调用方法。可能还有更多的方法可以实现这一点