c++ - g_signal_connect 错误成员使用无效

标签 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_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/

相关文章:

c++ - boost::static_visitor 作为映射值

c++ - NtSetInformationThread 使用安全吗?

c - 在 C 中初始化结构体 GHashTable

c - 关于 C 库如何工作的问题

c++ - 在C++中删除一个字符串对象

c++ - 我可以在 C++ 中使用指针访问二维数组的元素吗?

c++ - C++中的 vector 迭代器

linux - 配置 make gnome commander - no glib 2.6.0

c - 使用 glib 和 gtk+ 通过 USB 控制 ftdi 设备

c - 使用 sprintf 构建字符串时出现的问题