Forward Declaration einer Member-Variable?
-
Hallo zusammen,
wie gehe in C++ mit Klassenvariablen um, die nach ihrer Nutzung deklariert werden? Also sowas:
template <typename T> class A { private: std::vector<std::tuple<T, enum A<T>::state>> vec; public: enum state { IN_PROGRESS, INITIALIZED }; //... };
In der Vektordeklaration ist state noch unbekannt. Wie kann ich dies lösen, ohne die private und public Reihenfolge zu ändern?
Danke
-
Die Forward Declaration ist seit C++11 erlaubt. Die muss aber den Typ der Enum wissen, oder
enum class
, weil das dann implizietint
ist.template <typename T> class A { public: enum class state; private: std::vector<std::tuple<T, typename A<T>::state> > vec; public: enum class state { IN_PROGRESS, INITIALIZED }; //... };
-
@freakC sagte in Forward Declaration einer Member-Variable?:
ohne die private und public Reihenfolge zu ändern?
Ist zwar für Dich offenbar keine Option, aber bei mir kommen öffentliche Typdefinitionen immer zuerst. Alleine Schon der Übersichtlichkeit und Dokumentation für den Benutzer wegen.
-
Das ist mit dem Standard-
enum
nicht möglich, da der Compiler die Größe des Datentyps benötigt (und bei einemenum
ist das von den enthaltenen Werten abhängig).
Bei Verwendung vonenum class
ist dies jedoch möglich, da man dort den Datentyp explizit angeben kann (s. enum "scoped enumerations)):template <typename T> class A { private: enum class state : int; // forwarding std::vector<std::tuple<T, A<T>::state>> vec; // A<T>:: sollte hier überflüssig sein public: enum class state : int // explizit Datentyp angegeben ('int' ist aber Standard, kann also hier auch ganz entfernt werden) { IN_PROGRESS, INITIALIZED }; //... };
Bei Zugriff auf die Member des
enum class
mußt du jedoch immer explizit den Namen voranstellen, d.h. z.B.state::IN_PROGRESS
oder alternativusing enum state;
vorher verwenden.Ich würde aber auch einfach die Reihenfolge ändern.