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.

    😕


Anmelden zum Antworten