ich bin grade dabei mich in Templates einzuarbeiten. Nur leider komme ich da ja mal garnicht weiter. Bekomme beim linken immer folgende Fehlermeldungen:
Temporäre Dateien und Ausgabedateien für "TStack_01 - Win32 Debug" werden gelöscht.
Code:
--------------------Konfiguration: TStack_01 - Win32 Debug-------------------- Kompilierung läuft... main.cpp TStack.cpp Linker-Vorgang läuft... main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall TStack<char>::~TStack<char>(void)" (??1?$TStack@D@@QAE@XZ) main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: char __thiscall TStack<char>::Pop(void)" (?Pop@?$TStack@D@@QAEDXZ) main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: int __thiscall TStack<char>::Size(void)" (?Size@?$TStack@D@@QAEHXZ) main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: int __thiscall TStack<char>::Push(char)" (?Push@?$TStack@D@@QAEHD@Z) main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall TStack<char>::TStack<char>(int)" (??0?$TStack@D@@QAE@H@Z) Debug/TStack_01.exe : fatal error LNK1120: 5 unaufgeloeste externe Verweise Fehler beim Ausführen von link.exe.
TStack_01.exe - 6 Fehler, 0 Warnung(en) :cry:
Muß ich da beim VC++ noch ihrgendetwas einstellen ? Wär echt super wenn mir da einer weiterhelfen kann ! Ich sag schonmal DANKE.
Hier der code:
C++:
// TStack.h
#ifndef STACK_H #define STACK_H // Stack als Template !!
#include <iostream.h> #include <string.h>
template <class TDaten> class TStack { private: TDaten *daten; int anz; int anzmax; public: TStack(int); ~TStack();
Bei Templates darf keine .cpp Datei verwendet werden: alles in den header, auch die Implementierung. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21)
Aber ich! Ich möchte schon gern wissen, wieso Templates nur in den Header Files geschrieben werden müssen. Schließlich ist für den Compilier egal, weil der #include Preprozessor ist wie ein copy & paste. Wieso lässt sich nicht in den Cpp Dateien schreiben? -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth!
Ich würde das auch so verstehen wie Jogi 76 es beschrieben hat.
Du machst ja quasi eine Datentypenunabhänigige beschreibung deiner Funktionen und klassen. Erstellt wird die passende Implementierung dazu automatisch vom compiler erst dann, wenn du diese konkret auf einen Typen anwendest -- ...fleißig wie zwei Weißbrote
Jogi hat recht. Die eigentlichen Klassen werden zur Compilezeit aus den templates erstellt, und dafür muss auch die Implementierung bekannt sein. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra