map und Templateklasse
-
Also ich bin da gerade an einer Stelle Code die nicht funktioniert. Habe mir gerade selber eine Erklärung gegeben. Meine Frage ist nun ist die Erklärung richtig.
Möchte eine std::map erstellen mit einem CString als Key und einer Templateklasse als Value.
Gehe ich nun recht in der Annahme, dass eine Map nur Werte eines bestimmten Typs aufnehmen kann und somit nur eine speziallisierte Templateklasse.
Ich kann also keine Werte aufnehmen vom Typ CMyClass<int> und ebenfalls vom Typ CMyClass<double>.
Lösung wäre: Templateklasse von einer Basisklasse ableiten und die map dann vom Typ der Basisklasse deklarieren?
Ist das so richtig? Oder gibts ne bessere Lösung?
-
Du kannst zwar als Template Parameter wieder ein Template angeben. Letztendlich wird aber ein Typ benötigt (nicht Template). Das Template wird zur Compile-Zeit erzeugt und der Compiler muss wissen was T (Template Parameter) für ein Typ ist.
CMyClass<int> und CMyClass<double> haben für den Compiler keine Gemeinsamkeiten und sind 2 völlig verschiedene Klassen. Willst du die in einen Containern tun, musst du sie von einer gemeinsamen Basisklasse ableiten.
-
Da lag ich ja vollkommen richtig. Danke
-
Noch ne Frage:
So nun habe ich also in meiner Map Objekte der abgleiteten Klasse "getarnt" als Basisklasse. Nun suche ich mir ein Objekt aus der Map raus. Nun möchte ich von diesem Objekt einen Wert auslesen. Dieser Wert ist ja nun aber nicht in der Basisklasse sondern in der abgeleiteten. Nun muss ich also das Objekt der Basisklasse in meine abgleitete Klasse casten. Da diese ja aber nun eine Templateklasse ist erhalte ich beim dynamic_cast den Fehler: CMyDerivedClass ist kein polymorpher Typ.
Wie kann ich nun also auf den Wert zugreifen?
-
Sorry nicht ganz richtig.
Der Fehler ist nicht bei CMyDerivedClass sondern bei CMyBaseClass.
-
Ok. Basisklasse hatte keine virtuellen Methoden. Konstruktor virtuell gemacht, was man ja sowieso machen sollte, und schon funktioniert es.
-
Konstruktor virtuell? Wirklich?