Klassentemplate kompiliert nicht
-
Ich will ein Klassentemplate für Arrays erstellen und kompilieren. Hier mal der bisherige (und gerade problematische Code:
array.hxx
#ifndef ARRAY__HXX_ #define ARRAY__HXX_ #include <stdexcept> #include <iostream> template <class T> class Array { private: int arraySize; T* data; public: Array(int size); ~Array(); const int size(); T& operator[] (int i) throw (std::range_error); void resize(int newSize); }; #endifarray.cpp
#include "array.hxx" #include <iostream> template <class T> Array<T>::Array(int size) : arraySize(size) { data = new T[this->arraySize]; } template <class T> Array <T> ::~Array() { delete [] data; } ...main.cpp
#include "array.hxx" #include <iostream> int main() { // create integer array std::cout <<"Testing constructor:"<< std::endl; Array<int> int_arr(10); ... }Beim Compilieren meiner .cpp Dateien spuckt mir jetzt Der Compiler folgende Fehler aus:
/tmp/ccFsSZ9A.o: In function `main': arraytest.cpp:(.text+0x31): undefined reference to `Array<int>::Array(int)' arraytest.cpp:(.text+0x3d): undefined reference to `Array<int>::~Array()' collect2: error: ld returned 1 exit statusIch hab den entsprechenden Code jetzt schon minutenlang "angestarrt" und bin ihn durchgegangen, kann jedoch keinen Fehler finden. Könntet ihr bitte auch mal einen Blick drauf werfen?

-
Der Standardfehler bei Benutzung von Templates:
http://www.c-plusplus.net/forum/151578 (Nummer 5)Außerdem:
- Stil: Auch data kannst du in der Initialisierungsliste initialisieren.
- Fehler: Regel der großen Drei / Regel der großen Fünf verletzt.
-
Ah, verstehe, dankeschön. Was meinst du mit Regel der gro0en Drei oder Fünf?
-
-
SeppJ schrieb:
- Stil: Auch data kannst du in der Initialisierungsliste initialisieren.
Geschmackssache. Wenn etwas Ausnahmen werfen kann, kommt es auf die Reihenfolge drauf an und dann finde ich es übersichtlicher, wenn es im Konstruktor geschieht.
Weitere Kleinigkeiten:
Kalkihe schrieb:
const int size();Das const steht am falschen Ort (hier heisst es: Der Rückgabewert von size() ist konstant, was sinnlos ist und vom Kompiler ignoriert wird). =>
int size() const;int ist etwas ungeeignet, da es auch negative Werte zulässt. Besser wäre wohl size_t.
T& operator[] (int i) throw (std::range_error);Diese Art von Exception Specifications ist deprecated und wird aus C++ entfernt. Bitte das throw(std::range_error) löschen.
-
Ja, das ich das mit dem const falsch gemacht habe, ist mir soeben auch aufgefallen, trotzdem danke für den Hinweis

Nun, ich bearbeite hier gerade eine Aufgabe, die ich abgeben muss. Und dieser throw ist explizit gefordert, sodass ich Punkte einbüsen würde, wenn ich ihn entferne. Ich werde ihn jetzt also mal stehen lassen, ihn aber danach nicht mehr verwenden und bei Gelegenheit meinen Dozenten darauf hinweisen.
SeppJ schrieb:
Ich bin ja noch nicht fertig mit Programmieren
