Fehler bei der Benutzung von Templates
-
Hallo Zusammen
Habe mal wieder ein C++ Programm geschrieben, doch ich habe - glaube ich - irgendwo einen kleinen Fehler und finde ihn nicht. Kann mir jemand auf die Sprücnge helfen?
//============================================================================ // Name : 0203.cpp // Author : Robin // Description : Circular Buffer //============================================================================ #include <iostream> #include "0203.h" using namespace std; CircularBuffer::CircularBuffer(int index) { next = index; for(int i=0;i<20;i++) { A[i] = 1; } } void CircularBuffer::add(T value) { int i=0; while(i<20) { if(A[i]==" ") A[i]=value; else i++; } if(i==20) A[0]=value; } T CircularBuffer::find(T value) { int i=0; while(i<20&&A[i]!=value) i++; if(A[i]==value) cout << "An der Stelle " << i << " ist der Wert " << value << " vorhanden."; else cout << "Der Wert " << value << " ist im Buffer nicht enthalten."; } void CircularBuffer::print() { for(int i=0;i<20;i++) { cout << "Die Werte im Buffer betragen: " << A[i]; } } int main() { CircularBuffer<int> buffer; buffer.print(); return 0; }
Und das header File:
//============================================================================ // Name : 0203.h // Author : Robin // Description : Circular Buffer //============================================================================ #ifndef 0203_H_ #define 0203_H_ #include <iostream> template<typename T> class CircularBuffer { public: CircularBuffer(int next); void add(T value); T find(T value); void print(); T A[20]; private: int next; }; #endif
**** Internal Builder is used for build ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\0203.o ..\src\0203.cpp
..\src\0203.cpp: In functionint main()': ..\\src\\0203.cpp:14: error: expected primary-expression before "template" ..\\src\\0203.cpp:14: error: expected
;' before "template"
Build error occurred, build is stopped
Time consumed: 1969 ms.Ich bin mit meinem Latein nun wirklich am Ende, warum will das mit den Templates nicht funktionieren?
mfg
joethe
-
Code von Template-Klassen und -Funktionen müssen in der Klassen-Definition stehen, d. h. in diesem Fall in deinem Header. Der Compiler muss bereits zur Compile-Zeit wissen, was die Funktion macht und muss sie auch dementsprechend generieren. Bei der Implementierung in einem externen Source-File kennt der Compiler die Definition der Funktionen aber nicht.
-
Also habe jetzt das eine Problem mal behoben, aber hab auch schon wieder ein anderes...
Wie muss ich das jetzt wieder lösen? Ich finde auch im Web dazu keine Lösungvorschläge mehr...main.cpp
#include <iostream> #include "0203.h" using namespace std; int main() { CircularBuffer<int> a(); for(int i=0;i<15;i++) { a.add(i); } return 0; }
main.cpp.h
#include <iostream> using std::cout; using std::endl; template <typename T> CircularBuffer<T>::CircularBuffer() { next = index; for(int i=0;i<20;i++) { A[i] = 0; } } template <typename T> void CircularBuffer<T>::add(T value) { int i=0; while(i<20) { if(A[i]==" ") A[i]=value; else i++; } if(i==20) A[0]=value; } template <typename T> void CircularBuffer<T>::find(T value) { int i=0; while(i<20&&A[i]!=value) i++; if(A[i]==value) cout << "An der Stelle " << i << " ist der Wert " << value << " vorhanden."; else cout << "Der Wert " << value << " ist im Buffer nicht enthalten."; } template <typename T> void CircularBuffer<T>::print() { cout << "Die Werte im Buffer betragen: "; for(int i=0;i<20;i++) { cout << A[i]; } }
main.h
#include <iostream> #include "0203.cpp.h" template <typename T> class CircularBuffer { public: CircularBuffer(); void add(T value); void find(T value); void print(); T A[20]; private: int next; };
...???
Build:
**** Internal Builder is used for build **** g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\0203.o ..\src\0203.cpp In file included from ..\src\0203.h:8, from ..\src\0203.cpp:8: ..\src\0203.cpp.h:9: error: expected constructor, destructor, or type conversion before '<' token ..\src\0203.cpp.h:17: error: expected initializer before '<' token ..\src\0203.cpp.h:30: error: expected initializer before '<' token ..\src\0203.cpp.h:41: error: expected initializer before '<' token ..\src\0203.cpp: In function `int main()': ..\src\0203.cpp:16: error: request for member `add' in `a', which is of non-class type `CircularBuffer<int> ()()' Build error occurred, build is stopped Time consumed: 1516 ms.
-
1. im richtigen Forum posten
2. Fehlermeldung lesen
3. den relevanten Teil Posten (es fehlt 0203.cpp.h und 0203.cpp)
4. die Zeilen markieren die in der Fehlermeldung genannt werden.