Templatedefinition fehlerhaft?
-
Redemption schrieb:
Verzeih mir meine Unwissenheit, aber was meinst du mit grep?
grep ist ein Programm, das Textdateien nach bestimmten Mustern, z.B. "constant" durchsucht. Hätte ja sein können, dass Du irgendwo statt const mal constant geschrieben hast in einem Stück Sourcecode, dass Du nicht gepostet hast.
Redemption schrieb:
Zur Fehlermeldung: Das ist ja gerade das lustige - er meldet nur, dass er in dieser Zeile einen Fehler gefunden hat, und zwar 'constant'.
Welche ist "diese" Zeile? Und wie lautet die exakte Fehlermeldung?
Redemption schrieb:
In main() kann ich die Ausdrücke Array<Datum> kal(366); und Array<int> ai(5); ohne Fehler anwenden, in der Klassendefinition meldet er jedes Mal, wenn ich die Template-Klasse expandiere, egal ob mit einer vorgegebenen Klasse (int, char...) oder mit einer eigenen (Datum) diesen Fehler.
Schlussfolgerung: Es liegt vermutlich nicht an Array<>.
Es muss also an der Klassendefinition liegen, die ja anscheinend Datum erweitert. (Wieso ist ein Kalender eigentlich ein Datum?)
Kann es sein, dass dadurch irgendwas in die Brechen geht?
Mir fällt auf Anhieb kein Fehler auf.Was sagen andere Compiler?
-
Diese Zeile ist diese hier:
Array<Datum> kal(366);Den Tipp mit dem constant berücksichtige ich mal - wär zwar peinlich, aber was solls...
Und das ein Kalender kein Datum ist, stimmt natürlich, aber wir haben für die Schule gerade die Datum-Klasse geschrieben, und ich experimentier schon mal mit Vererbung, virtuellen Methoden und Templates herum. Mir ist schon klar, das diese Vererbungs-Hierarchie nicht der Realität entspricht und wahrscheinlich auch nicht zweckmäßig ist. Das ist sozusagen mein erster Gehversuch in Sachen Vererbung, Polymorphismus etc.
-
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; };