Template lässt sich nicht compilieren?



  • Hi,

    ich wollte mir eine klasse für statische 2D Arrays schreiben und rausgekommen ist das:

    template<typename T, unsigned int Zeilen, unsigned int Spalten> class basic_2darray 
    { 
    public: 
        basic_2darray  (void) {} 
        ~basic_2darray (void) {} 
    
        inline T* operator[] (unsigned int line) 
        { return & data_[line * Spalten]; } 
    
    private: 
        T data_[Zeilen*Spalten]; 
    };
    

    Jedoch bekomm ich bei T data_ folgenden Fehler:

    error C2057: expected constant expression
    warning C4200: nonstandard extension used : zero-sized array in struct/union

    Benutze VC++7.1. Das müsste doch eigentlich gehen? oder? Wenn nicht: wie kann ich es dann bewerkstelligen, das es läuft ohne new und delete?



  • [...] schrieb:

    error C2057: expected constant expression

    Kann ich nicht nachvollziehen. Zeig mal deine basic_2darray Instanzierung.

    [...] schrieb:

    warning C4200: nonstandard extension used : zero-sized array in struct/union

    Entweder ist Zeilen oder Spalten oder beides 0. Arrays der Grösse 0 sind aber nicht erlaubt.



  • Das ist der gesamte Code:

    template<typename T, unsigned int Zeilen, unsigned int Spalten> class basic_2darray 
    { 
    public: 
        basic_2darray  (void) {} 
        ~basic_2darray (void) {} 
    
        inline T* operator[] (unsigned int line) 
        { return & data_[line * Spalten]; } 
    
    private: 
        T data_[Zeilen*Spalten]; 
    };
    
    #include <iostream>
    
    struct tile
    {
        unsigned char x : 4;
        unsigned char y : 4;
        unsigned char textureID;
        unsigned char material;
    };
    
    int main (void)
    {
        int sizeX = 20;
        int sizeY = 10;
    
        basic_2darray<tile, sizeX, sizeY> map;
    
        map[0][4].textureID = 4;
    
        return 0;
    }
    


  • Ist klar, sizeX und sizeY ist kein konstanter Ausdruck.
    Entweder schreibst du direkt

    basic_2darray<tile, 20, 10> map;
    

    oder machst sizeX und sizeY konstant

    const int sizeX = 20;
        const int sizeY = 10;
        basic_2darray<tile, sizeX, sizeY> map;
    

    btw:
    Dein op[] ist imo nicht gut implementiert. Erstens fehlt eine const Version.
    Und zweitens ist es evtl. besser, wenn du für den Rückgabetyp 'nen Proxy machst. Dann kannst du auch zeilenweise arbeiten, zB für Zuweisungen

    map[0] = map[1];
    

    edit: btw war erst Mist



  • Aaaah verstehe das jetzt auch mit dem const! Danke!

    Der op[] nicht gut? Hmn hab den aus der FAQ, also wenn da soviel Mist steht... 😃


Anmelden zum Antworten