keine Übereinstimmung gefunden???



  • Hallo zusammen!

    Ich hab mal wieder ne kleine Frage!;)

    Folgender Code lässt sich problemlos übersetzen, klar:

    void func(TestClass& obj)
    {
       obj.method();
    }
    
    //in main:
    func(TestClass());
    

    Soweit OK! Nur warum gibt es denn bei folgender Variante Schwierigkeiten?

    template<class T> void func(T& obj)
    {
       obj.method();
    }
    
    //Der Aufruf unterscheidet sich nicht vom ersten Beispiel.
    //wieder:
    func(TestClass());
    

    Der Compiler meldet mir Folgendes:
    Keine Übereinstimmung für 'func<T>(TestClass)' gefunden

    Hab ich irgendwas verpasst? 😕

    Danke!

    Grüße,
    TS++



  • const !!!!



  • Danke für die ausführliche Antwort! 🙄
    Aber warum ist das so?
    Und natürlich:
    Was soll ich denn machen, wenn ich mir kein 'const' erlauben kann?
    D.h.: wenn auf die betroffenen temporären Objekte Methoden angewendet werden, die nicht mit 'const' gekennzeichnet sind?



  • mach doch

    TestClass t;
    func(t);



  • Hi!

    Mit TestClass() legst Du ein temporäres Objekt ab. Das darf der Compiler nicht ändern da die änderungen verloren gehen.

    Daher wäre

    template<class T> void func(T obj) 
    { 
       obj.method(); 
    }
    

    (aber teuer)

    und

    template<class T> void func(const T& obj) 
    { 
       obj.method(); 
    }
    

    Beides garantiert das keine änderungen gemacht werden.

    Alternativ wäre der Aufruf:

    TestClass t;
    func(t);



  • der erste code (wo du meinst der würde problemlos übersetzen) dürfte sich meines wissens garnicht übersetzen lassen 😃



  • Hallo!

    Eine Lösung in der Art

    TestClass t; 
    func(t);
    

    war mir schon bekannt. Soviel versteh ich auch! 😃

    Mich würde nur interessieren, warum der Compiler beim Template-Ansatz motzt, mich aber bei der Standardvariante gewähren lässt. Ich erzeuge doch beidemale temporäre Objekte!

    Merkwürdig! 😕

    Grüße,
    TS++


Anmelden zum Antworten