Funktionen bereist definiert?
-
Ich habe folgenden Qellcode:
#ifndef FCE_H #define FCE_H #include <deque> template <class T> class fce { private: typedef T collected; typedef T* pcollected; typedef T& rcollected; int datasets; std::deque<collected> data; public: fce(); ~fce(); rcollected pop_back(); rcollected pop_front(); rcollected pop(rcollected delone); void push_front(rcollected pushone); void push_back(rcollected pushone); class iterator { private: std::deque<collected>::iterator ptr; fce* data; public: iterator(T* nptr, fce* ndata); iterator(fce* ndata); iterator(T& nptr, fce* ndata); ~iterator(); T& operator *(); T* operator->(); iterator operator++(); iterator* pointer2iterator(T* pointer); }; iterator begin(); iterator end(); }; #include "fce.cpp" #endif
In fce.cpp stehen die definitionen zu den Funktionen. In der Datei main.cpp steht folgendes:
#include "fce.h" void main() { fce<int> intlist; }
Ich bekomme neun Fehler die alle für verschieden Funktionen etwa so ausshene:
error C2995: 'iterator::iterator' : Vorlagenfunktion wurde bereits definiert Siehe Deklaration von 'iterator::iterator'
[sind die bald wieder weg?]
:xmas1: :xmas2:
[sind die bald wieder weg?]mfg
Glamdring
-
eigentlich includet die cpp datei den header und nicht umgekährt
-
Dann müsste man aber die .cpp-Dateien statt den .h-Datein einfügen, wenn man die Inhalte nutzen will. ICh möchte Aber die Header-Datein einfügen und benutze daher diese Variante
mfg
Glamdring
-
nö das siehst du falsch, header inlcuden und cpp datei mit linken (unter msvc bedeutet das den projekt hinzufügen)
hast du dir das selbst beigebracht? ich kann mir nur schwer vorstellen das das so in einen buch stand
-
@Glamedrink
zeig dochmal den Code in der cpp Dateibtw. void main ist nicht legal
@Gerard
bei Template-Funktionen kann man das machen, anstelle direkt den Code in den Header zu schreiben (ausser man hat export :)), weil der Compiler ja beim erzeugen des Templates auch auf die Implementierung zurückgreifen muss.
-
1.Ja, das hab ich mir selbst beigebracht weil VC++ bei mir rummeckert, wenn ich den HEader einbinde und eine Funktion nutzen will, die in der .cpp-DAtei steht.
#include "fce.h" template <class T> fce<T>::iterator::iterator(T& nptr, fce<T>* ndata) { data = ndata; for(ptr = data.begin(), ptr != data.end(); ++ptr) { if(*ptr == nptr) { break; } } } template <class T> fce<T>::iterator::iterator(T* nptr, fce<T>* ndata) { data = ndata; for(ptr = data.begin(), ptr != data.end(); ++ptr) { if(ptr == nptr) { break; } } } template <class T> fce<T>::iterator::iterator(fce<T>* ndata) { data = ndata; ptr = data.begin(); } template <class T> T& fce<T>::iterator::operator *() { return(*ptr); } template <class T> T* fce<T>::iterator::operator->() { return(ptr); } template <class T> fce<T>::iterator fce<T>::iterator::operator++() { return(*ptr++); } template <class T> fce<T>::fce() { datasets = 0; } template <class T> fce<T>::~fce() { std::deque<T>::iterator iter; for(iter = data.begin(); iter != data.end(); ++iter) { delete &(*iter); } } template <class T> fce<T>::iterator* pointer2iterator(T* pointer) { std::deque<T>::iterator iter; for(iter = data->begin(); iter != data->end(); ++iter) { if(*iter == *pointer) { break; return(iter); } } return(data->front()); }
mfg
Glamdring
-
template-Funktionen lassen sich, jedenfalls bei VC6.0, nicht in der Quellcodedatei (.cpp) definieren.
Verschiebe die Definitionen einfach in die Header.
Dann inkludiere auch wirklich die Header in der Quellcodedatei und nicht andersrum und falls es dann noch Fehler gibt, kannst du wiederkommen.
Und int main(){return 0;} statt void main(){}MfG MAV
-
Ich hab alle Funktionen in die Header-DAtei gepackt, sind ja alle Templates, kein zusätzlicher Fehler, keiner weg. :xmas1:
mfg
Glamdrink
-
Jetzt sollte es allerdings funktionieren. Guck nochmal durch, ob irgendwo eine Datei noch im Projekt hängt, die nicht mehr rein gehört.
Vorher hat MSVC versucht, die .cpp einzeln zu kompilieren, wie er es mit jeder .cpp-Datei, die im Projekt eingebunden ist, eben tut. Die .cpp-Datei inkludiert den Header, der wiederum die .cpp-Datei inkludiert (die Include-Guards verhindern hierbei die Endlosrekursion). Dann sind natürlich die neun Elementfunktionen in fce.cpp doppelt definiert.
-
Ja, stimmt jetzt eghts, ich hab vergessen fce.cpp von der Kompilierung auszuschließen
, danke und frohes neues Jahr!
mfg
Glamdring