VS 2015 和 FLTK 回调问题

Posted

技术标签:

【中文标题】VS 2015 和 FLTK 回调问题【英文标题】:VS 2015 and FLTK Callback issue 【发布时间】:2016-02-05 13:48:23 【问题描述】:

我正在尝试移动我的 FLTK 项目并在 VS 2015 社区版下编译它。这样做时,我遇到了错误。我有如下代码:

#include <Fl/....>
....
class CWindow

private:
    ....
    Fl_Input *_textInputEditor;
    ....
    void _cbTextInput(Fl_Widget *refObject, void *objData)
    
        // Do something when callback is triggered.
    
public:
....
    void createWindow()
    
        ....
        _textInputEditor = new Fl_Input(....);
        _textInputEditor->when(FL_WHEN_ENTER_KEY);
        _textInputEditor->callback((Fl_Callback*)&CWindow::_cbTextInput, this);
        ....

当我尝试编译时,我得到一个错误:

Error C2440 'type cast': cannot convert from 'void (__thiscall CWindow::* )(Fl_Widget *,void *)' to 'Fl_Callback (__cdecl *)

同样的代码在 Win 7 下完美地与 MinGW 5.x 编译(IDE:C::B)。

有人可以帮我吗?我想要回调我的 CWindow 类的私有方法。

【问题讨论】:

【参考方案1】:

签名不正确。 _cbTextInput 应该是静态的。那么问题将是访问成员变量。

static void _cbTextInput(Fl_Widget *refObject, void *objData)

    // No access to member variables so cast it to a CWindow* to get
    // at the member variables
    CWindow* self = (CWindow*) objData;
    self->cbTextInput();

    // Alternatively, if you do not wish to write another routine,
    // you will need to put self-> in front of every member variable
    // you wish to access.  Just personal preference: some people prefer
    // it that way.


void cbTextInput()

    // This has access to member variables
    ...

【讨论】:

我之前尝试过这个,但是我得到了这个错误:Error LNK2001 unresolved external symbol __imp___strdup。还有为什么这会在 MinGW 中编译和工作? 由于演员阵容而编译。如果删除演员表,构建可能会失败。如果你用 -Wall 构建,它会告诉你你在非法做什么。 strdup 问题是一个不同的问题:您编译的编译模型(MD、MT、MDD 或 MTD)与您的库不同。 谢谢。这行得通。但是知道为什么我的旧代码(没有静态代码)在 mingw 5.x 中成功编译和构建了吗? 它是否在没有演员表的情况下编译? 我刚刚用 mingw 尝试过:在没有静态的情况下出现相同的错误。我使用的是 4.8.1 版本。

以上是关于VS 2015 和 FLTK 回调问题的主要内容,如果未能解决你的问题,请参考以下文章

FLTK 按钮回调给 c3867

FLTK 值更改和重绘等到回调之后:有啥办法吗?

如何在自己的回调中访问 FLTK 按钮? [复制]

FLTK:按下哪个按钮 - 将数字传递给按钮的回调(lambda)

带有按钮回调的新窗口未在 fltk 中打开

试图在 C++ 中的 Fltk GUI 中单击鼠标右键