template<class T> List {...}; Problem



  • Guten Tag zusammen,

    es wäre super, wenn mir jemand helfen könnte.

    Zu Übungszwecken möchte ich eine vector Klasse schreiben und nenne sie "List".
    List.h :

    #pragma once
    
    template <class T> class List
    {
    private:
    	T* list;
    	unsigned int count;
    public:
    	List(void);
    	void add(T element);
    	T& operator[] (const int nIndex);
    	~List(void);
    };
    

    List.cpp :

    #include "List.h"
    #include <cstdlib>
    
    #ifndef NULL
    #define NULL 0
    #endif
    
    template <class T> List<T>::List(void)
    {
    	this->list = NULL;
    	this->count = NULL;
    }
    
    template <class T> void List<T>::add(T element)
    {
    	this->count++; // increment field size
    	this->list = (T*) realloc(this->list, this->count * sizeof(T)); // realloc dynamic storage
    	this->list[this->count-1] = element; // adding last entry
    }
    
    // overloading [] operator
    template <class T> T& List<T>::operator[] (const int nIndex)
    {
    	return this->list[nIndex];
    }
    template <class T> List<T>::~List(void)
    {
    	free (this->list);
    }
    

    Ich benutze MVS 2005 und wennich das ganze Projekt erstelle dann kommen keine Fehler, wenn ich jedoch versuche es zu debuggen, dann erhalte ich folgende Meldung:

    1>------ Erstellen gestartet: Projekt: List, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>Main.cpp
    1>Verknüpfen...
    1>Main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall List<int>::~List<int>(void)" (??1?List@H@@QAE@XZ)" in Funktion "\_main". 1>Main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: \_\_thiscall List::List(void)" (??0?List@H@@QAE@XZ)" in Funktion "_main".
    1>H:\EigeneDaten\Visual Studio 2005\Projects\C++\List\Debug\List.exe : fatal error LNK1120: 2 nicht aufgelöste externe Verweise.
    1>Das Buildprotokoll wurde unter "file://h:\EigeneDaten\Visual Studio 2005\Projects\C++\List\Debug\BuildLog.htm" gespeichert.
    1>List - 3 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Meine Main ist lediglich:

    #include <iostream>
    #include <string>
    #include "List.h"
    
    using namespace std;
    
    int main (void)
    {
    	List<int> d;
    	return 0;
    }
    

    Vielen Dank für eure Hilfe, ich weiß echt nicht woran das liegt! 🙄



  • kronos_m schrieb:

    ...
    List.h :

    ...
    

    List.cpp :

    ...
    

    Geht nicht mit templates.
    Die Implementierung mus mit in den Header!

    Da gibt's sogar einen FAQ-Eintrag zu: click.

    Gruß,

    Simon2.



  • kronos_m schrieb:

    Zu Übungszwecken möchte ich eine vector Klasse schreiben und nenne sie "List".

    Etwas verwirrend, wenn man bedenkt, dass "List" meistens verkettete Listen bezeichnet, findest du nicht? 😉



  • Hab mir das einfach aus c# geklaugt, wo der vector in etwa der in c# verwendeten List<typ> entspricht!



  • Ich hab das ganze nun direkt in die List.h implementiert. Aber ein weiteres Problem:
    Die IntelliSense funktion scheint für meine template Klasse nicht mehr zu funktionieren. Woran liegt das und wie bekomme ich das hin, dass das doch geht? 😕

    List<int> l;
    	l.add(2);
    	l.add(3);
    	cout << l.size() << endl;
    

    ==> funktioniert ohne Probleme!

    Danke für eure Hilfe!

    PS.: Benutze MVS 2005



  • Kronos_m schrieb:

    Die IntelliSense funktion scheint für meine template Klasse nicht mehr zu funktionieren.

    Sollte eigtl nicht passieren - auch mal gespeichert und paar Sekunden gewartet?

    bb



  • Habe einen anderen klugen Beitrag dazu gefunden.
    Habe die *.ncb Datei in dem Projektmappenverzeichnis gelöscht, seit dem läuft alles super 😃

    Danke noch mal an alle...



  • kronos_m schrieb:

    [...] Zu Übungszwecken [...]

    #pragma once
    
    template <class T> class List
    {
    private:
    	T* list;
    	unsigned int count;
    public:
    	List(void);
    	void add(T element);
    	T& operator[] (const int nIndex);
    	~List(void);
    };
    

    Ok, vier Sachen noch:

    • #pragma once ist kein C++ Standard
    • Deine Klasse verletzt die Dreierregel ==> Du kannst das Ding nicht vernünftig kopieren oder zuweisen.
    • Man kann Dein Objekt gar nicht fragen, wieviele gültige Elemente es speichert.
    • Wenn ich eine Referenz des Typs const List<T>& habe, kann ich damit nichts anfangen

    Für die letzten beiden Punkte siehe hier:

    T      & operator[]       (int idx);
        T const& operator[] const (int idx);
        int size() const;
    

    Gruß,
    SP



  • Sebastian Pizer schrieb:

    T      & operator[]       (int idx);
        T const& operator[] const (int idx);
        int size() const;
    

    Upps, wie peinlich... das zweite const kommt natürlich hinter (int idx) .

    Gruß,
    SP


Anmelden zum Antworten