1

コードをコンパイルしようとすると、次のエラーが発生します。

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関数はクラスにあり、そのクラスのコンストラクターからsを実行しようとしていますが、g_signal_connectそれはこの問題に何らかの影響を及ぼしますか?

4

1 に答える 1

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

または、GTK+のC++バインディングであるGTKmmを使用することもできます。

于 2010-04-21T09:02:53.453 に答える