Array mit konstanter Größe
-
Wieso geht das hier nicht:
class Foo { static const int bufferSize; float passedTimeBuffer[bufferSize]; }; const int Foo::bufferSize = 20;Mein Compiler meckert mit den Worten: Konstanter Ausdruck erwartet. bufferSize ist doch konstant.

-
template<typename T> class foo { static const std::size_t size; T bar[foo::size]; }; template <typename T> const std::size_t foo<T>::size = 32;das geht nicht?
-
welcher kompiler? welche Version? ...?
Sry, aber Glaskugel ist gerade in Reperatur.EDIT: Warum nicht so?
class Foo { static const int BUFFER_SIZE = 21; float passedTimeBuffer[BUFFER_SIZE]; };
-
Konstant schrieb:
Wieso geht das hier nicht:
class Foo { static const int bufferSize; float passedTimeBuffer[bufferSize]; }; const int Foo::bufferSize = 20;Mein Compiler meckert mit den Worten: Konstanter Ausdruck erwartet. bufferSize ist doch konstant.

Foo::buffersize ist eine konstante Variable. Das allein genügt aber nicht, damit der Ausdruck
Foo::bufferSize
ein konstanter Ausdruck wird. Zu diesem Zweck muss die konstante Variable auch noch mit einem konstanten Ausdruck initialisiert worden sein (und Literale sind konstante Ausdrücke). Dort, wo buffersize verwendet wird (in der Definition von Foo) hat die Initialisierung aber noch nicht stattgefunden - mithin ist buffersize dort auch kein konstanter Ausdruck. Weil das unschön ist, erlaubt C++ es, statische integrale Memberkonstanten direkt in der Deklaration zu initialisieren. Einer gesonderten Definition (die dann keinen Initialisierer enthalten darf) bedarf es dann nur, wenn das Programm in einer Weise von der Konstante gebrauch macht, die ein lvalue benötigt (etwas exakter: if it is used in the program...). mithinclass Foo { static const int bufferSize = 20; float passedTimeBuffer[bufferSize]; }; // hier nicht notwendig const int Foo::bufferSize;
-
Danke camper.

-
camper schrieb:
...
class Foo { static const int bufferSize = 20; float passedTimeBuffer[bufferSize]; };...Das betrifft zwar die wenigsten: Wenn es nicht klappen sollte (z.B. muss ich mit einem alten Compiler arbeiten), kann man den "Enum-Hack" versuchen (Statt einer Konstante ein Enumwert benutzen).
cu André