error: invalid use of member (did you forget the ‘&’ ?)
-
hey guys!
ich bekomm beim kompilieren folg. fehler:
error: invalid use of member (did you forget the ‘&’ ?)
und zwar in meiner Klasse:
class xyz { public: xyz ( Typ* ptr ) // Allgemeiner C-Tor { /** HIER BEKOMME ICH DIE FEHLERMELDUNG 3 MAL ( FÜR JEDES 'g_signal_connect' ) **/ g_signal_connect ( ptr, "button-release-event", G_CALLBACK(foo1), NULL ) ; g_signal_connect ( ptr, "enter-event", G_CALLBACK(foo2), NULL ) ; g_signal_connect ( ptr, "leave-event", G_CALLBACK(foo3), NULL ) ; } private: //... };
Ich habe schon eine vermutung woran es liegen könnte:
#define g_signal_connect (instance, detailed_signal, c_handler, data)
das komische ist, wenn ich es mit dem C-Compiler kompiliere funktioniert. Wieso??? ( natürlich ohne klassen )
int main ( int argc, char** argv ) { //... g_signal_connect ( ptr, "button-release-event", G_CALLBACK(foo1), NULL ) ; g_signal_connect ( ptr, "enter-event", G_CALLBACK(foo2), NULL ) ; g_signal_connect ( ptr, "leave-event", G_CALLBACK(foo3), NULL ) ; }
kann mir jemand erklären wieso ?
-
MR.Q(uestion) schrieb:
das komische ist, wenn ich es mit dem C-Compiler kompiliere funktioniert. Wieso??? ( natürlich ohne klassen )
ähhh, was für ein Blödsinn. Ich meine wenn ich die Events in 'main' definiere geht es!
int main ( int argc, char** argv ) { //... g_signal_connect ( ptr, "button-release-event", G_CALLBACK(foo1), NULL ) ; g_signal_connect ( ptr, "enter-event", G_CALLBACK(foo2), NULL ) ; g_signal_connect ( ptr, "leave-event", G_CALLBACK(foo3), NULL ) ; }
-
Was sind foo1, foo2, foo3: freie Funktionen oder Member-Funktionen?
Bei Member-Funktionen müßtest du diese als 'static' deklarieren.
-
Warum nimmst du für
g_signal_connect
ein Makro und keine Funktion?
-
Th69 schrieb:
Was sind foo1, foo2, foo3: freie Funktionen oder Member-Funktionen?
Bei Member-Funktionen müßtest du diese als 'static' deklarieren.Geht auch nicht:
error: cannot declare member function ‘static bool xyz::foo1(...)’ to have static linkage
Nexus schrieb:
Warum nimmst du für g_signal_connect ein Makro und keine Funktion?
Gibt es denn eine funktion ?
-
Ah, das steht in einer Bibliothek? Davon hast du nichts gesagt.
Zeig mal, wie das Makro definiert ist.
-
Also hier ist die Dokumentation.
Und hier die definition von dem makro.
ich verstehe halt nicht wieso das ganze in "main" ausführbar ist und in einer Klasse nicht
was mache ich falsch?
-
Die Definition steht dort aber nicht. Naja, egal.
Kannst du einen kompletten, aber doch möglichst kurzen Code zeigen? Also mit Deklaration aller verwendeter Typen für beide Fälle (innerhalb der Klasse und innerhalb
main()
)?
-
okay
so sieht es daweil in der klasse aus ( funktioniert nicht )
class Events { public: Events ( ClutterActor* image ) { g_signal_connect ( image, "button-release-event", G_CALLBACK(picture_release), NULL ) ; g_signal_connect ( image, "enter-event", G_CALLBACK(picture_hover), NULL ) ; g_signal_connect ( image, "leave-event", G_CALLBACK(picture_leave), NULL ) ; } private: gboolean picture_release ( ClutterTexture*, ClutterEvent*, gpointer ) ; gboolean picture_hover ( ClutterTexture*, ClutterEvent*, gpointer ) ; gboolean picture_leave ( ClutterTexture*, ClutterEvent*, gpointer ) ; }; inline gboolean Events::picture_release ( ClutterTexture* image, ClutterEvent* event, gpointer data ) { printf ( "Objekt wurde angeklickt\n" ) ; return TRUE ; } inline gboolean Events::picture_hover ( ClutterTexture* image, ClutterEvent* event, gpointer data ) { printf ( "Maus ist über Objekt\n" ) ; return TRUE ; } inline gboolean Events::picture_leave ( ClutterTexture* image, ClutterEvent* event, gpointer data ) { printf ( "Maus hat Objekt verlassen\n" ) ; return TRUE ; }
Und in main sieht es so aus ( funktioniert )
int main( int argc, char** argv ) { //... g_signal_connect ( image, "button-release-event", G_CALLBACK(picture_release), NULL ) ; g_signal_connect ( image, "enter-event", G_CALLBACK(picture_hover), NULL ) ; g_signal_connect ( image, "leave-event", G_CALLBACK(picture_leave), NULL ) ; //... }
Die funktionsdefinitionen sind gleich
-
push
-
Ich tippe darauf, dass du den Unterschied zwischen Zeigern auf Funktionen (d.h. freie Funktionen) und Zeigern auf Memberfunktionen nicht kennst. Wenn als Parameter ein Funktionszeiger erwartet wird, dann kannst du nicht einfach so einen Memberfunktionszeiger übergeben. Eine statische Memberfunktion würde aber gehen.
http://www.cpp-tutor.de/cpp/le07/funktionzeiger.html
http://www.cpp-tutor.de/cpp/le09/memberzeiger.html
-
OhneName schrieb:
Eine statische Memberfunktion würde aber gehen.
Funktioniert
vielen dank! :xmas1:
-
Habe ich doch schon geschrieben gehabt:
Bei Member-Funktionen müßtest du diese als 'static' deklarieren.