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 implizietintist.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-
enumnicht möglich, da der Compiler die Größe des Datentyps benötigt (und bei einemenumist das von den enthaltenen Werten abhängig).
Bei Verwendung vonenum classist 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 classmußt du jedoch immer explizit den Namen voranstellen, d.h. z.B.state::IN_PROGRESSoder alternativusing enum state;vorher verwenden.Ich würde aber auch einfach die Reihenfolge ändern.