2010-04-20 106 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