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)' gefundenHab 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++