我正在尝试编译一些代码,但出现以下错误:
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
是一个 GtkWidget *
并且 graph_expose
定义为:
gboolean graph_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data);
据我所知,我做的一切都是正确的,但我仍然遇到这个错误。有人可以帮忙吗?
更新:
抱歉各位,我搞糊涂了,我的 graph_expose
函数在一个类中,我正在尝试从该类的构造函数中执行 g_signal_connect
,会以任何方式影响这个问题?
最佳答案
由于 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++ 绑定(bind)。
关于c++ - g_signal_connect 错误成员使用无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2678665/