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/unionBenutze 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 direktbasic_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 Zuweisungenmap[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...