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 onceist 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
constkommt natürlich hinter(int idx).Gruß,
SP