Templatedefinition fehlerhaft?



  • 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;
    };
    

Anmelden zum Antworten