【问题标题】:g_signal_connect error invalid use of memberg_signal_connect 错误无效使用成员
【发布时间】:2011-02-10 08:13:19
【问题描述】:

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

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_connects,这会以任何方式影响这个问题吗?

【问题讨论】:

  • graph_expose 是某个类中的方法还是独立函数?
  • @doublep:是的,它是一个独立的函数
  • 好吧,我正打算建议某事。沿线&Class::graph_expose,但由于它不是会员,我不确定。试试&graph_expose 是否有效,以防万一。
  • 在 g_signal_connect 调用之前是否声明了 graph_expose 函数?
  • 您是从成员函数执行此操作并且在范围内有一些 graph_expose 成员吗?

标签: c++ glib


【解决方案1】:

由于 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++ 绑定。

【讨论】:

猜你喜欢
  • 2013-06-27
  • 2018-12-01
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多