Templatedefinition fehlerhaft?
-
Danke für die Hilfe, wird gemacht. Fehlermeldung folgt gleich.
-
Okay, so besser?
template <class T> class Array { public: Array(int array_s = 1) : size(array_s) { ar_pt = new T(size); if(ar_pt == NULL) cerr << "Fehler bei Speicherallozierung aufgetreten." endl; } ~Array(void) { delete ar_pt; } int ar_size(void) { return (size); } T& operator[](int index) { if(index < 0 || index >= size) { cerr << "Ungueltige Index-Laufweite."; } return (ar_pt[index]); } private: unsigned int size; T* ar_pt; };Hab außerdem die Vererbung bei Kalender (von Datum) entfernt. Copykonstruktor und Zuweisungsoperator lass ich jetzt mal aus und implementier die dann später, wenn ich weiß, warum ich diese Fehlermeldung erhalte.
c:\documents and settings\administrator\desktop\c++ - programme\kalender\kalender_k.h(32) : error C2059: syntax error : 'constant'
-
Ich habs mal ein wenig geändert.
Welche Zeile ist eigentlich die Zeile 32?template <class T> class Array { public: Array(unsigned int array_s = 1) : size(array_s) { if( size > 0 ) ar_pt = new T[size]; else ar_pt = 0; } ~Array() { delete[] ar_pt; } int ar_size() { return (size); } T& operator[](unsigned int index) { if( index < size ) return (ar_pt[index]); cerr << "Ungueltige Index-Laufweite."; } private: unsigned int size; T* ar_pt; };
-
Redemption schrieb:
Array(int array_s = 1) : size(array_s) { ar_pt = new T(size); if(ar_pt == NULL) cerr << "Fehler bei Speicherallozierung aufgetreten." endl; }Nur eine Vermutung - aber sollten da nicht eher eckige Klammern hinkommen? "ar_pt=new T[size];"
-
@Braunstein: Zeile 32 ist diese hier
Array<Datum> kal(366);innerhalb der Klasse Datum. In main() funktioniert diese Anweisung ohne Fehler, deshalb bin ich ob der nicht gerade erhellenden Fehlerwarunung ein wenig verwirrt.
@CStoll: Ich hab's auch schon mit eckigen Klammern probiert, nützt nichts.
-
Redemption schrieb:
@CStoll: Ich hab's auch schon mit eckigen Klammern probiert, nützt nichts.
Trotzdem solltest du für jedes new ein delete und für jedes new[] ein delete[] aufrufen. Alles andere ist undefiniert!
Gruß Caipi
-
Es müssen eckige Klammern sein, sonst wird ja kein Array erzeugt.
Funktioniert denn ein Array<int>? Du kannst mir ja mal die erforderlichen Dateien schicken, da kann ich dann besser nachschauen.
-
Auch mit eckigen Klammern funktioniert es nicht.
Bei Einsetzen von int erhalte ich ebenfalls diesen Fehler.@Braunstein: Wie ist denn deine @-Mail-Adresse? Würde mir sehr helfen, falls du dir dass einmal anschauen könntest.
-
Verzeihung, hab gerade gesehen, dass ich Blödsinn geschrieben habe: Die Fehlermeldung weist auf die Instantiierung des Datum-Arrays in der Klasse Kalender hin, nicht in der Klasse Datum.
-
Meine e-Mail Adresse ist in meinem Profil
-
Hab gerade entdeckt, dass die Fehlermeldung verschwindet, sobald man den Parameter für den Konstruktor von Array<T> weglässt.
Das sieht folgendermaßen aus:
Die Klasse Kalender
class Kalender { public: Kalender(int j = 2006) : jahr(j) { if(!schaltjahr(j)) { // delete kal[366]; } } virtual ~Kalender(void) { } short int schaltjahr(int); Array<Datum> kal(); // Anscheinend gültig. Array<Datum> kal1(300); // constant-Fehler. Array<Datum> kal2(jahr) // Einfach eine x-beliebige Variable // -> Fehler: // "syntax error : identifier 'jahr'" private: unsigned int jahr; };Die Template-Klasse Array<T>
template <class T> class Array { public: Array(int array_s = 1) : size(array_s) { ar_pt = new T[size]; cout << "Konstruktor"; if(ar_pt == NULL) cerr << "Fehler bei Speicherallozierung aufgetreten." << endl; } ~Array(void) { delete []ar_pt; } int ar_size(void) { return (size); } T& operator[](unsigned int index) { if(index < 0 || index >= size) { cerr << "Ungueltige Index-Laufweite."; } return (ar_pt[index]); } private: unsigned int size; T* ar_pt; };
-
Du kannst die Membervariablen nicht in der Klassendeklaration initialisieren. Versuch's mal lieber so:
class Kalendar { public: Kalendar(int j=2006) : kal(j),jahr(j) {} ... private: Array<Datum> kal; int jahr; };