2010-04-20 42 views
1

我试图编译一些代码,我发现了以下错误:的g_signal_connect错误无效使用成员

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); 

所以发因为我可以告诉我做的一切正确,但我仍然得到这个错误。任何人都可以帮忙吗?

UPDATE:

对不起球员,我糊涂了,我graph_expose功能的一类,而我试图从类的构造函数做g_signal_connect S,会以任何方式影响这个问题?

+0

'graph_expose'是某个类或独立函数中的一个方法吗? – doublep 2010-04-20 21:17:17

+0

@doublep:是的,这是一个独立的功能 – paultop6 2010-04-20 21:27:22

+0

那么,我正在建议某事。沿着'&Class :: graph_expose'行,但由于它不是成员,所以我不确定。如果'&graph_expose'工作,以防万一。 – doublep 2010-04-20 21:36:44

回答

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

+0

除非您希望代码意外中断,否则在需要C回调时使用免费函数 - 为什么参见例如这里:http://stackoverflow.com/questions/2068022/in-c-is-it-safe-portable-to-use-static-member-function-pointer-for-c-api-callb – 2010-04-25 17:29:20