Stack Class <template> [solved]
-
Hallo allesamt
Ich habe eine Stack Klasse entworfen die mit festen Datentypen super funktioniert. Jetzt wollte ich diese Klasse als Template umschreiben um nicht mehr auf einen Datentyp fixiert zu sein.
Da ich im Gebiet der Templates noch recht neu bin hab ich keine Lösung für folgendes Problem gefunden:Mein Header
template<class VT> struct SNode { int Value; SNode *next; SNode *previous; }; //----------------------------------------------------- template<class T> class CStack { public: CStack(); ~CStack(); bool Push(T Cmd); T Pop(); void Flush(); int Length(); T ItemAtIndex(int Number); bool HasElements; char LastError[20]; private: int length; SNode<T> *pCurrent; protected: };Meine .cpp die per #incldue ans Ende der Headerdatei angehängt wird (der Übersicht halber nur der Teil der Fehler verursacht):
template<class T>CStack<T>::CStack() { pCurrent = NULL; length = 0; HasElements = false; }wenn ich das versuche zu kompilieren spuckt mir der Compiler (MS VC2010) das hier aus:
stack.cpp(3): error C2143: syntax error : missing ';' before '<' stack.cpp(3): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int stack.cpp(3): error C2988: unrecognizable template declaration/definition stack.cpp(3): error C2059: syntax error : '<'Ich vermute die Lösung ist recht einfach aber da ich mich wiegesagt mit Templates noch nicht gut auskenne sehe ich es einfach nicht.
VG
ghost
-
Syntaktisch sieht das richtig aus (und wird auch von meinem Compiler geschluckt). Mag MSVC vielleicht nicht den Mangel an Leerzeichen in deinem Funktionsheader?
Und du compilierst die .cpp auch nicht einzeln, oder?
edit: Wenn ich genauer drüber nachdenke, komme ich zu dem Schluss, dass es wahrscheinlich genau das ist, was du, möglicherweise unbeabsichtigt, machst. Lies mal die FAQ durch, da gibt es einen Eintrag zum Thema Templates, der sich damit befasst.
-
ghostcoder schrieb:
Meine .cpp die per #incldue ans Ende der Headerdatei angehängt wird
Inkludiere nie .cpp-Dateien. Nimm für Template-Implementierungen eine andere Endung, z.B. .inl.
-
In
SNodesollteValuevom TypVTsein. InCStacksollte der Parameter vonPushlieberconst T& CmdstattT Cmdsein. Alleints für die Höhe sollten eigentlichstd::size_tsein.
Die MethodeItemAtIndexsolltest du überladen:const T& ItemAtIndex(std::size_t Index) const;T& ItemAtIndex(std::size_t Index);
HasElementsist Quatsch (kennst du keine Kapselung?). Mach eine MethodeEmpty, die einfach!lenghtzurrückgibt. UndLastErrorist ja ein Witz. Nutze die Ausnahmebehandlung von C++.
-
Erstmal danke für die Antworten.
Die FAQ hatte ich mich schon durchgelesen, deshalb auch das #inlcude .cpp am Ende der Headerdatei. Hätte ich eigtl. drauf kommen müssen, dass die .cpp dann noch mal extra compiliert wird. Problem hat sich damit erledigt.