template für Methode
-
Hallo,
ich soll als Hausaufgabe Klassen erstellen mit 3 Membervariablen und 2 Methoden (Schueler, Wagen, Tier). Allerdings gibt es da ein kleines Problem, da von Wagen und Tier jeweils die dritte Membervariable einen Zahlentyp enthält und ich mit der Methode lesen() einen der Werte jeweils zurückgeben möchte.
Ich habe mich noch nicht wirklich mit Templates beschäftigt, daher weiß ich leider nicht wo der Fehler ist. Die Fehlermeldung istklassen.cpp: In function
int main()': klassen.cpp:41: error: no matching function for call towagen::lesen(int)'
klassen.cpp:42: error: no matching function for call towagen::lesen(int)' klassen.cpp:43: error: no matching function for call towagen::lesen(int)'Die Methode (die lesen Methode aus der tier-Klasse schaut fast gleich aus):
template <typename autoinfo> autoinfo lesen(int auswahl) { switch(auswahl) { case 1: return this->marke; break; case 2: return this->bezeichnung; break; case 3: return this->preis; break; } }Ich habe es auch mit einem cast nach autoinfo versucht, aber noch immer der gleiche Fehler. Ich glaube, wegen dem Schlüsselwort template oder wegen autoinfo kann lesen nicht mehr gefunden werden. Stimmt das?
Das Ganze habe ich auf http://de.wikibooks.org/wiki/C++-Programmierung:_Funktionstemplates nachgelesen.
Was ist der Fehler und wie behebe ich ihn?
Danke,
Squall
-
template <typename T> T wagen::lesen(int auswahl) { switch(auswahl) { case 1: return this->marke; break; case 2: return this->bezeichnung; break; case 3: return this->preis; break; } }Soweit ich verstanden hab, gehts hier doch um zwei Werte die ausgegeben sollen, das könntest du einfach über das überladen machen...
stell dir vor, jemand g ibt da lesen<float> ein, dann hast du ein problem.^^
Ahja iwas stimmt in deiner main auch nicht, poste den code ma^^Guck mal hier: http://www.cpp-tutor.de/cpp/le15/le15_02.htm#einleitung
Da bekommst du noch infos zu den templates
Edit: Ahja ich würde es doch lieber mit Überladen probieren, da der code sehr unschön ist^^
-
In wie fern überladen? Ich will ja eigentlich nur, dass die Werte zurückgeliefert werden. Cout kann bei bedarf in der main Funktion verwendet werden.
Wieso eigentlich wagen::lesen schreiben, diese Funktion befindet sich direkt in der Klasse, ich wollte sie nur halt nicht komplett posten.^^
Die main Funktion schaut so aus:
int main() { wagen autohaus[3]; autohaus[0].aendern("Mercedes", "SLR Coupé / Roadstar", 476000.00); autohaus[1].aendern("Mercedes", "CL Coupé", 112276.50); autohaus[2].aendern("Mercedes", "SLK Roadstar", 36503.25); cout << schule[0].lesen(1) << endl << schule[0].lesen(2) << endl << schule[0].lesen(3) << endl; }
-
Deine Funktion lesen soll also je nach Bedarf ein string, ein int oder irgendeinen anderen Typ zurückgeben?
Das geht so nicht. Auch nicht mit Templates.
Wenn die Funktion nur zur Ausgabe verwendet werden soll gib doch einfach alle Werte als String zurück (mit entsprechenden Umwandlungen).
Noch was zu dem template. Bei deiner Templatefunktion ist der Rückgabewert ein Template. Den kann der Compiler aber nicht zur Compilezeit herausfinden. Du müsstest den also mit angeben.
-
Braunstein schrieb:
Deine Funktion lesen soll also je nach Bedarf ein string, ein int oder irgendeinen anderen Typ zurückgeben?
Jup.
Braunstein schrieb:
Wenn die Funktion nur zur Ausgabe verwendet werden soll gib doch einfach alle Werte als String zurück (mit entsprechenden Umwandlungen).
Joa, das war meine erste Idee, aber ich wollte es mal so ausprobieren. Nun ja, ich lass es nun als string.

Braunstein schrieb:
Noch was zu dem template. Bei deiner Templatefunktion ist der Rückgabewert ein Template. Den kann der Compiler aber nicht zur Compilezeit herausfinden. Du müsstest den also mit angeben.
Ach so, hmmpf... Ich werde mich demnächst einfach mal in templates reinarbeiten.
Dankeschön!

-
Das ist leider kein gutes Beispiel für eine Template-Funktion!
Und den Fehler werde ich dir jetzt erklären:
Der Templatetyp kann nur aus den Funktionsparametern automatisch bestimmt werden, nicht aus dem Rückgabewert.
Du müßtest also jeweils beim Aufruf noch den entsprechenden Typ angeben, z.B.
schule[0].lesen<float>(3)Nur leider bringt dir das dann auch nichts... teste es einfach mal.
Der Sinn einer Template-Methode ist, daß man sich Schreibarbeit sparen will, anstatt jeweils für jeden Typ die Funktion zu schreiben.
Eine Funktion kann aber niemals verschiedene Rückgabetypen haben!!!
Du solltest einfach für jeden Wert eine eigene Funktion schreiben...