Templatedefinition fehlerhaft?
-
Okay, constant war mal keines drin.
Sonst noch irgendwelche Vorschläge?Irgendjemand weiß doch immer eine Antwort, dachte ich?
-
Hallo,
Poste doch bitte mal die exakte Fehlermeldung.
Deine Array-Klasse ist auch noch ziemlich fehlerhaft, oder ist das nicht der ganze Quellcode.
Da du mit new im Konstruktor Speicher anforderst, musst du den auch mit delete im Destruktor wieder freigeben.
size sollte unsigned int (oder size_t) sein.
Beim new muss auf size==0 getestet werden.
Wo sind Copykonstruktor und Zuweisungsoperator? Du mußt die entweder implementieren oder zumindest verbieten (im private deklarieren).
-
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; };