Templateklasse von normaler Klasse ableiten
-
Hi,
wie geht man eigentlich vor, wenn man eine Templateklasse hat, welche eine normale Klasse als Basis hat?
Die Definition der Templateklasse muss in den Header.
Doch wie sieht es mit der Definition der Basisklasse aus?
Wenn ich sie ganz normal in eine Quelldatei packe und die Templateklasse instantiiere, bekomme ich Linkerfehler: "unresolved external symbol" (bei Funktionen der Basisklasse).
Wenn ich sie in den Header packe, bekomme ich Linkerfehler: "one or more multiply defined symbols found".Danke und schöne Feiertage!
-
Man muss erstmal die Definition der Klasse und die der Memberfunktionen unterscheiden. Die Defintion der Klasse muss in den Header, in beiden Fällen. Bei Klassen Templates müssen auch die Memberfunktionen in den Header. Bei normalen Klassen kann man die Definition der Memberfunktionen in eine *.cpp Datei auslagern oder inline im Header (entweder explizit oder implizit in der Klassendefinition). Das du einen Linkerfehler wegen "unresolved external symbol" kriegst ist ungewöhnlich. Sicher, dass die Datei dazu gelinkt wird?
-
Ich werde mal ein Minimalbeispiel erstellen.
Mir ist jedoch was eingefallen: Könnte es sein, dass der Code der Basisklasse erst nach dem der Templateklasse erstellt wird (alphabetische Reihenfolge?), und daher beim Linken (noch) nicht gefunden wird?
-
Change schrieb:
Mir ist jedoch was eingefallen: Könnte es sein, dass der Code der Basisklasse erst nach dem der Templateklasse erstellt wird (alphabetische Reihenfolge?), und daher beim Linken (noch) nicht gefunden wird?
Nein!
-
Der Fehler ist verschwunden (nach einem Rebuild). Der Code ist gleich geblieben.
Wohl ein Bug im Visual Studio.. vielleicht wegen inkrementellem Linken oder so.
-
Change schrieb:
Wohl ein Bug im Visual Studio.. vielleicht wegen inkrementellem Linken oder so.
Du solltest in der Regel davon ausgehen, dass deine Werkzeuge erst einmal fehlerfrei funktionieren. Echte Fehler in diesen von riesigen Teams entwickelten und getesteten Werkzeugen sind äußerst selten.
-
Der inkrementelle Build von Visual Studio ist aber tatsächlich etwas verbugged. Vor allem wenn man viele Änderungen durchgeführt hat ist dieser manchmal etwas verwirrt und compiliert einige Dateien nicht neu oder irgendwie sowas. Ein Rebuild löst es dann.
-
Solche Probleme mit Visual Studio sind tatsächlich nichts neues, man muss sie erkennen können. Der Compiler produziert keinen fehlerhaften Code, davon kann man ausgehen. Aber dass beim Bauen mal komische Fehler auftreten, die sich dann durch einen Rebuild lösen lassen, kommt öfter mal vor.
-
Jop, schon klar dass ich erst mal von einem Fehler auf meiner Seite ausgehe.
Ich kann mich aber auch erinnern, schon öfters Fehler gehabt zu haben, die nach einem Rebuild plötzlich weg waren.
Naja, klar, bugfrei ist VS bestimmt nicht. Grade erst beim Debuggen gecrasht (mit plötzlich >3GB RAM Auslastung), anstatt einen pure virtual function call anzuzeigen.