关于c ++:g_signal_connect错误无效使用成员

g_signal_connect error invalid use of member

我试图编译一些代码,但得到了以下错误:

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

这来自G_信号_连接呼叫:

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

Drawing_Area_CPUGtkWidget *graph_expose定义为:

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

据我所知,我做的每件事都很好,但我还是得到了这个错误。有人能帮忙吗?

更新:

抱歉,伙计们,我搞糊涂了,我的graph_expose函数在一个类中,我正试图从该类的构造函数中执行g_signal_connect函数,这会以任何方式影响这个问题吗?


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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,它是C++绑定的GTK+。