Templatedefinition fehlerhaft?
-
[quote="Storm.Xapek.de"]Ich verwende cstdio weil das besser zum rest der bibliothek passt, die arbeiten nämlich mit Ansi-Sequenzen
z.B.//Cusor setzen int cusor(int cursor_x, int cursor_y) { std::printf("\033[%d;%dH" , cursor_x ,cursor_y); std::fflush(stdin); return 0; }Du hast y und x vertauscht.
-
Bei mir wirds nicht gemacht
storm@localhost ~/Desktop/C%2fC++/Versuch/Ansi $ g++ -c ansi.cpp ansi.cpp: In function `int storm::stop(int, T)': ansi.cpp:56: error: syntax error before numeric constantg++ (GCC) 3.3.6
Ihr habt recht, dass ganze hat keinen richtigen Sinn (bis jetzt halt noch nicht) ich will nur mal eine Bibliothek erstellen, was auch klappt. Nur ist irgendwas in dem Funktions kopf falsch, und mir kommt einfach nicht ein was!
PS: das mit x und y hab ich nochnicht getestte, weil mir dieses template den letzten nerv raubt.
ich änders gleich um danke!
-
Storm.Xapek.de schrieb:
Ihr habt recht, dass ganze hat keinen richtigen Sinn (bis jetzt halt noch nicht) ich will nur mal eine Bibliothek erstellen, was auch klappt.
Hmm... wenn Du schon Bibliotheken schreibst, ist Dir sicherlich auch bewußt, dass Templates jeweils für den entsprechenden Datentyp kompiliert werden, sich die Sourcecodes für das komplette Template daher in einer Headerdatei (.h) und nicht in einer bereits kompilierten Datei (.o) wiederfinden.
Ansonsten hätte das Template nur für die Programmierung Deiner Bibliothek, nicht aber für die Anwendung der Bibliothek Sinn. Und den Sinn Deiner Funktion sehe ich darin, dass das Template Dir Fehler ermöglicht, die Any's Variante verhindert. Spricht also nicht grade für die Verwendung von Templates ;->
Storm.Xapek.de schrieb:
Nur ist irgendwas in dem Funktions kopf falsch, und mir kommt einfach nicht ein was!
Wenn der 4.0.3 es ohne Meldung kompiliert und der 3.3.6 nicht, dann würde ich die Frage mal vorsichtig umformulieren. Was macht der 3.3.6 anders als der 4.0.3... bzw. warum macht eine neuere Version das.
Ich habe jetzt schon länger keine Templates mehr verwendet, aber so wie ich das sehe, scheint die Definition ok zu sein, was mir zumindest der 4.0.3 auch nicht widerlegt.
Gibt's eine Version 3.3.7? ;->
-
Hm ich glaub ich schmei den template wirklich raus.
Und versuchs mal mit ner überladenen Funktion.Vielen Dank für eure Hilfe.
(Ich will auch den GCC 4.0.3 wusst garnicht das es den schon gibt)
-
Ach jetzt verstehe ich was du meintest, der erste parameter bestimmt ja ob per eingabe oder per zeit, hatte dich falsch verstanden, sorry.
Aber mir ist immernoch schleierhaft warum dein zweiter parameter kein char sein darf, wenn du doch nur ein einzelnes zeichen einliest und es mit dem zweiten parameter vergleichst.
Außerdem würd ich den ersten Parameter zu nem enum machen, mit nem schönen Namen kann man mehr anfangen, als mit 1 und 2. Alternativ geht natürlich auch ne Konstante (const int, kein define).
-
Hi Leute,
momentan ärgere ich mich mit einer Template-Klasse rum, die folgendermaßen definiert ist:
template <class T> class Array { public: Array(int array_s = 1) : size(array_s) { ar_pt = new T[size]; } ~Array(void) { } int ar_size(void) { return (size); } T& operator[](int index) { if(index < 0 || index >= size) { cerr << "Ungueltige Index-Laufweite."; } return (ar_pt[index]); } private: int size; T* ar_pt; };Wenn ich dann versuche, diese Template-Klasse zu expandieren, indem ich sie in einer Klasse Kalender implementiere, was folgendermaßen aussieht,
class Kalender : public Datum { public: Kalender(int j = 2006) { if(!schaltjahr(j)) { // delete kal[366]; } } virtual ~Kalender(void) { } short int schaltjahr(int); Array<Datum> kal(366); Array<int> ai(5); };schmeißt mir der tolle Compiler entgegen, er hätte in Zeile soundso (Expandierung der Template- in Datum- bzw. int-Klasse) den Syntax-Fehler 'constant' gefunden. Hat jemand eine Ahnung, woran das liegen könnte?
-
Tschuldige, hab vorher falschen Benutzernamen eingegeben.
Sorry @ any
Redemption
-
Any schrieb:
Hi Leute,
schmeißt mir der tolle Compiler entgegen, er hätte in Zeile soundso (Expandierung der Template- in Datum- bzw. int-Klasse) den Syntax-Fehler 'constant' gefunden. Hat jemand eine Ahnung, woran das liegen könnte?Könntest Du die exakte Compilermeldung wiedergeben.
Syntaxfehler... klingt nach ... falsch geschrieben.Hast Du mal grep 'constant' durch Deinen Quellcode laufen lassen, insbesondere da, wo Datum definiert wurde?
-
Bitte ignorieren [versehentlich 2x geschickt]
-
Verzeih mir meine Unwissenheit, aber was meinst du mit grep?
Zur Fehlermeldung: Das ist ja gerade das lustige - er meldet nur, dass er in dieser Zeile einen Fehler gefunden hat, und zwar 'constant'.
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.
-
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