Templatedefinition fehlerhaft?



  • 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



  • 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


Anmelden zum Antworten