Template Fehler



  • CEinheit::CEinheit(void)
    	: iAnzahl_Panzerzug(0), iAnzahl_Panzergrenadierzug(0), iAnzahl_Infanteriezug(0), sName_Einheit("Standard")
    {
    	vector<Zug<A>> vAZg;
    }
    

    Das ist einer der 2 Konstruktoren der Klasse CEinheit. Dort sagt er mir, dass der Bezeichner A nicht bekannt ist.
    Hier noch die Fehlermeldungen des Compilers:

    einheit.cpp(11): error C2065: 'Panzer': nichtdeklarierter Bezeichner
    einheit.cpp(11): error C3203: "Zug": Die nicht spezialisierte template-Klasse kann nicht als template-Argument für den template-Parameter "_Ty" verwendet werden, ein realer Typ wurde erwartet.
    einheit.cpp(11): error C2955: "Zug": Für die Verwendung der template-Klasse ist eine template-Argumentliste erforderlich.
    template_zug.h(6): Siehe Deklaration von 'Zug'



  • Wo kommt denn in deinem Code der Bezeichner "Panzer" vor? (wenn ich raten müsste, heißt A in deinem Programm Panzer)
    Und hast du an der Stelle überhaupt den Typ A/Panzer definiert?



  • Ja du hast Recht, sorry. Mit Panzer ist das A gemeint.
    Ich habe es jetzt mal so versucht:

    CEinheit::CEinheit(void)
    	: iAnzahl_Panzerzug(0), iAnzahl_Panzergrenadierzug(0), iAnzahl_Infanteriezug(0), sName_Einheit("Standard")
    {
    	Zug<Panzer> PzZg;	
    	vector<Zug<Panzer>> vPzZg;
    }
    

    Und das sind die Fehlermeldungen. Das ist das erste Mal, dass ich mich mit Templates beschäftige, ich habe in 3 verschiedenen Büchern nachgesehen, aber ich kann den Fehler nicht entdecken. In den Büchern sind aber leider immer nur Beispiele drin, entweder wie der vector implementiert ist oder wie man ein stack-template programmiert.

    einheit.cpp(10): error C2065: 'Panzer': nichtdeklarierter Bezeichner
    einheit.cpp(10): error C2133: 'PzZg': Unbekannte Größe
    einheit.cpp(10): error C2512: 'Zug': Kein geeigneter Standardkonstruktor verfügbar
    einheit.cpp(11): error C2065: 'Panzer': nichtdeklarierter Bezeichner
    cpp(11): error C3203: "Zug": Die nicht spezialisierte template-Klasse kann nicht als template-Argument für den template-Parameter "_Ty" verwendet werden, ein realer Typ wurde erwartet.
    einheit.cpp(11): error C2955: "Zug": Für die Verwendung der template-Klasse ist eine template-Argumentliste erforderlich.
    template_zug.h(6): Siehe Deklaration von 'Zug'


  • Mod

    Die Fehlermeldung ist doch sehr eindeutig. Es ist an der Stelle nicht bekannt, was ein Panzer sein soll. Also: Was ist ein Panzer und bist du ganz sicher, dass dies auch bekannt ist? (Tipp: Normalerweise hat der Compiler mit so etwas immer Recht. Panzer ist nicht bekannt, irgendetwas musst du übersehen)



  • Ja Panzer ist nicht bekannt, wie definiere ich jetzt aber den Typ Panzer? Mein Ziel ist es eine Schablone zu haben, wo ich folgendes habe Zug<Panzer>, Zug<Infanterie>, Zug<IrgendeineEinheit>, die ich dann wiederum in einen Vector packe. Ok, ich weiss jetzt wo das Problem liegt, aber mir fällt keine Lösung ein, ich drehe mich irgendwie im Kreis habe ich das Gefühl.


  • Mod

    😕 Hat denn der Panzer keine weiteren Eigenschaften außer der Bezeichnung als Panzer? Wie dem auch sei, hier die Lösung die du übersehen hast:

    class Panzer
    {
     // ...
    };
    


  • Im Endeffekt soll sich eigentlich nur der Typname ändern, vielleicht ist das aber auch ein vollkommen falscher Ansatz mit einem Template?
    Hatte vorher 3 verschiedene Klassen, die jede eine .h und .cpp Datei hatte. Diesen Schreibaufwand wollte ich umgehen und auch sicherstellen, dass ich später noch andere Einheitentypen leicht hinzufügen kann.



  • Auch wenn ich für jeden Typ eine Klasse erstelle kommt folgender Fehler:

    Einheit.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall Zug<class Panzer>::~Zug<class Panzer>(void)" (??1?$Zug@VPanzer@@@@QAE@XZ)" in Funktion ""public: __thiscall CEinheit::CEinheit(void)" (??0CEinheit@@QAE@XZ)".

    Test.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.



  • Das beduetet, daß du bei den ganzen Methoden des Zug-Templates vergessen hast, dessen Destruktor zu definieren:

    template<typename T>
    Zug<T>::~Zug()
    {
      // mach irgendwas
    }
    

  • Mod

    CStoll schrieb:

    Das beduetet, daß du bei den ganzen Methoden des Zug-Templates vergessen hast, dessen Destruktor zu definieren:

    Nein, das heißt hier liegt schon wieder so ein Fall vor, wo einfach Destruktoren und Konstruktoren in der Klasse deklariert wurden, ohne dass dies nötig wäre (ich glaube ein gewisser Buchautor macht das auch immer). Hier wurde nicht verstanden, wozu man das überhaupt in manchen Fällen braucht und warum meistens nicht.

    @Threadersteller: Du suchst wohl eher:

    class Zug
    { 
     // ...
    };
    
    class Panzerzug: public Zug
    {
    };
    
    class Infanteriezug: public Zug
    {
    };
    


  • Das Buch von Wolf habe ich schon lange weggepackt und alle Sachen dort verdrängt, ich orientiere mich mittlerweile an Stroustrups Büchern, die allerdings auch nicht immer leicht zu verstehen sind als Anfänger.
    Das mit der Vererbung wäre mein Schritt gewesen, wenn es absolut keine Lösung gibt, oder der Lösungsweg absolut ausserhalb meines Horizonts liegt 😉

    Aber wie kann man denn mit einem Klassentemplate ein Objekt unbekannten/variablen Typs erstellen, oder geht das einfach nicht?

    Vielen Dank für die Hilfe,
    MkG Nas


Anmelden zum Antworten