Problem mit 'const' und Templates
-
Hallo!
Ich bin leider kein C++/Templates Spezialist und wäre Euch deshalb für einen Tipp bei folgendem Problem sehr dankbar:
Um mich in das Thema Templates einzuarbeiten habe ich als Übung vor einiger Zeit ein kleines Tool geschrieben. Dieses Programm habe ich mit "MS VC++ 2009 Express" erstellt und es lief prima. Nun hab ich einen neuen Rechner und "MS VC++ 2010 Express" installiert. Nun läßt es sich erstaunlicherweise nicht mehr kompilieren. Die Fehlermeldung lautet:
***`
C2662: 'Titel::getName': this-Zeiger kann nicht von 'const Dance<sort>' in 'Titel &' konvertiert werden
with
[
sort=1
]
Durch die Konvertierung gehen Qualifizierer verloren`***
Auf der MS Seite steht als Erklärung, dass es sich um ein fehlendes/überflüssiges "const" handelt und man dieses entfernen bzw. an entspr. Stelle hinzufügen muß. Das Seltsame ist aber dass trotz des "const" in der Fehlermeldung in meinem kompletten Quellcode überhaupt kein "const" vorkommt.
Die Definition der Klasse "Dance" lautet nämlich wie folgt (ohne const!):
template<int sort = SORT_INTERPRET> class Dance : public TitelDiese wurde von der Klasse "Titel" abgeleitet:
class TitelBei der Benutzung des Iterators tritt dann die Fehlermeldung auf:
if ( (*it_INTERPRET).getName().size() > iName_Size)Hat Jemand eine Idee?
Wenn nötig kann ich gerne den gesamten Quelltext posten (ist kein Copyright drauf
). Wollte hier bloß nicht das ganze Forum zu müllen.Besten Dank im Voraus!
Bernd
-
Nein, du brauchst nicht alles zu posten, nur die wesentlichen Teile: Das wären in diesem Fall wohl die Deklaration des Iterators und der Methode Titel::getName().
(ich vermute ja, daß du die MEthode nicht als konstant definiert hast - darum kann sie nicht mit konstanten Objekten genutzt werden)
-
Danke für die schnelle Antwort! Hier die Deklaration von Titel::getName():
string getName ( void );und die Deklaration des Iterators:
set<Dance_INTERPRET>::iterator it_INTERPRET;
-
Wie ich es erwartet habe: Die set-Elemente sind konstant, deshalb liefert der Iterator einen
const<Key>&zurück. Deine Methode ist aber nicht konstant, deshalb kann sie von dem aus dem set<> herausgegebenen Objekt nicht genutzt werden. Die Lösung dazu ist ganz einfach:string getName( void ) const;PS: Das Problem hatt übrigens nichts mit Templates zu tun, das hättest du auch mit einer set<Titel> erlebt

-
Das wars! 1000 Dank!
Ich hab mit diesem Ding schon 2 Tage zu gebracht und an alle möglichen und unmöglichen Stellen testweise ein "const" hin gepflanzt. Allerdings eben nicht an die Stelle an die es hin gehört hätte.
Ich hatte schon vermutet dass das "const" irgendwo implizit mit rein kommt. Dann war's also das "set"."Dummerweise" leistet mir dieses Tool, obwohls ja eigentlich nur als "Übung" gedacht war, mittlerweile so gute Dienste, dass ich mich schon sehr geärgert habe, es nicht mehr zum laufen zu kriegen.
Vielen Dank!
Bernd