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


Anmelden zum Antworten