1

我正在尝试编译一些代码,但出现以下错误:

error: invalid use of member (did you forget the ‘&’ ?)

这来自 g_signal_connect 调用:

g_signal_connect ((gpointer) Drawing_Area_CPU, "expose-event", 
        G_CALLBACK (graph_expose), NULL);

Drawing_Area_CPU是 aGtkWidget *并且graph_expose定义为:

gboolean graph_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data);

据我所知,我做的一切都是正确的,但我仍然得到这个错误。有人可以帮忙吗?

更新:

对不起,伙计们,我很困惑,我的graph_expose函数在一个类中,我正在尝试g_signal_connect从该类的构造函数中执行 s,这会以任何方式影响这个问题吗?

4

1 回答 1

4

由于 GTK+ 是用纯 C 编写的,回调必须是纯函数或静态方法,因此如果您希望能够将类方法用作回调,则必须使用某种静态代理方法:

class foo {
    foo () {
        g_signal_connect (GtkWidget *widget, GdkEventExpose *event,
                          G_CALLBACK (foo::graph_expose_proxy), this);
    }

    gboolean graph_expose (GtkWidget *widget, GdkEventExpose *event) {
        // sth
    }

    static gboolean graph_expose_proxy (GtkWidget *widget, GdkEventExpose *event, gpointer data) {
        foo *_this = static_cast<foo*>(data);
        return _this->graph_expose (widget, event);
    }
}

或者,您也可以使用 GTKmm,它是 GTK+ 的 C++ 绑定。

于 2010-04-21T09:02:53.453 回答