g_signal_connect错误无效使用成员

时间:2010-04-20 21:10:58

标签: c++ glib

我正在尝试编译一些代码,我收到以下错误:

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_CPUGtkWidget *graph_expose定义为:

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

到目前为止,我可以告诉即时通信,但我仍然得到这个错误。有人可以帮忙吗?

更新:

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

1 个答案:

答案 0 :(得分: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 ++绑定。