Problem mit Template-Klasse
-
Hallo,
beschäftige mich gerade mit Templates und habe ein Problem:
ich habe eine Klasse für eine Tabelle erstellt. die Funktionen zur Verwaltung von Daten zur Verfügung stellt.
Zusätzlich habe ich eine Klasse Mitarbeiter erstellt, die in die Tabelle eingetragen werden soll.
table.h#ifndef _TABLE_H #define _TABLE_H template <class TR, class TK> class Table // Tabelle für Records vom beliebigen Typ TR // und Schlüssel vom beliebigen Typ TK { public: Table(unsigned m); // kreiert leere Tabelle für maximal m Records ~Table(); // gibt den von der Tabelle belegten Speicher wieder frei void Reorg(unsigned m); // Tabelle um m zusätzliche Records erweitern bool Append(TR r); // fügt neuen Record am Ende ein bool IsEmpty(); // true wenn Tabelle leer, sonst false bool IsFull(); // true wenn Tabelle voll, sonst false unsigned Length(); // liefert aktuelle Länge der Tabelle bool First(); // erster Record wird zum aktuellen Record bool Next(); // der dem aktuellen Record folgende Record // wird zum neuen aktuellen Record bool Previous(); // der dem aktuellen Record vorausgehende Record // wird zum aktuellen Record bool Find(TK x); // Record mit Schlüssel x wird zum aktuellen Record bool FindFirst(TK x); // erster Record mit Schlüssel größer oder // gleich x wird zum aktuellen Record bool Insert(TR &r); // fügt neuen Record vor dem aktuellen Record ein bool Delete(); // löscht aktuellen Record bool GetNode(TR &r); // liefert aktuellen Record in der Recordvariablen r bool SetNode(TR &r); // ersetzt aktuellen Record durch Recordvariable r bool SeqSearch(TK x); // Sequenzielles suchen bool BinSearch(TK x); // Binäres suchen void InsertSort(); // Sortieren durch einfügen void SelectionSort(); // Sortieren durch Auswählen void ExchangeSort(); // Direktes sortieren durch austauschen void IndirectSort(TR *a, int *s, int n); // Indirektes Sortieren int Partition(int l, int r); void QuickSortTable(int l, int r); void Merge(int l, int m, int r); void MergeSort(int l, int r); private: unsigned max; // maximale Länge der Tabelle unsigned n; // aktuelle Länge der Tabelle int iterator, *s; // Index-Iterator für den aktuellen Record TR *a; // Zeiger auf Tabelle void Mean(int l, int r); void Median(int l, int r); void Swap(TR &a, TR &b); // vertauschen der beiden Records a und b };Mitarbeiter.h
#include "table.h" class Mitarbeiter { public: void Generate(unsigned k, char *str, unsigned a, float g); bool operator != (Mitarbeiter &r); unsigned GetKey() { return key; } friend ostream & operator << (ostream & os, Mitarbeiter &m); private: char Name[30]; unsigned key; unsigned Alter; float Gehalt; }; void Mitarbeiter::Generate(unsigned k, char *str, unsigned a, float g) { key=k; Alter=a; Gehalt=g; if (strlen(str)<30) strcpy(Name,str); else { for (int i=0; i<29; i++) Name[i]=str[i]; Name[29]='\0'; } } bool Mitarbeiter::operator != (Mitarbeiter &m) { if (key!=m.key) return true; if (strcmp(this->Name,m.Name)) return true; if (Alter!=m.Alter) return true; if (Gehalt!=m.Gehalt) return true; else return false; } ostream & operator << (ostream & os, Mitarbeiter &m) { os << endl << m.key << " " << m.Name << " Alter: " << m.Alter << " Gehalt: " << m.Gehalt; return os; }Wnn ich nun versuche in der main.cpp mit
Table<Mitarbeiter, unsigned> m(50);mit der Klasse zu arbeiten bekomme ich folgende Fehlermeldung:
"[Linker Fehler]Unresolved external'Table<Mitarbeiter, unsigned int>()'referenced from ..."
Kann mir jemand einen Tipp geben, was ich hier falsch mache?
Beschäftige mich erst die letzten Tage mit Templates.
Vielen Dank im Voraus
-
Wenn's noch nicht exisistiert, sollte das Thema auf jeden Fall in die FAQ

@Sebi-Fr: Schau dir mal meine Erklärungen hier an - die Symptome waren zwar anders, aber das Kernproblem ist identisch.
-
Probleme gibt es mit der Aufteilung in die verschiedenen Dateien?
Habe alles in eine main-Datei kopiert -> gleiche Meldung
Habe eine Header und eine C++-Datei -> gleiche Meldung
-
Hi, der trick ist der das du bei Templates nicht nur die Deklaration sondern auch die Definition der Klasse mit in die Header datei schreiben musst damit das ganze "gesehen" wird.
also den inhalt von table.cpp in die table.h mit reinschreiben oder die table.cpp mit #include unter die deklaration der classe in die table.h einfuegen
gruessle
-
Und wo hast du die Definitionen der Table-Methoden untergebracht? Die muß der Compiler dort sehen, wo er eine Table<...> anlegen und verwenden soll (also am besten inline direkt in den Header packen).
-
Danke für eure Infos. Versuche mal das ganze entsprechend anzupassen