Template kein zugriff auf Parentmember
-
also ich habe folgendes Problem das compiled so weit aber nutze ich z.b.
tPPool< XXX >::getSingleton();bekomm ich einen linker error "Nicht aufgelöstes externes Symbol protected: static class tPPool<class XXX> * Singleton<class tPPool<class XXX> >::my_singleton"
also ich erbe ja sämtliche public member von Singleton doch selbst wenn ich jetzt tPPool sagen würde "static tTemplateType* my_singleton" meckert er genauso rum

Ich habe solangsam das Gefühl der fehler liegt an den __forceinline, vielleicht verhalten sich templates die ja zur compilezeit generiert werden bei der inline eigenschaft etwas anders und sie kopieren die funktion von der parentclass runter als ob sie diese privat definiert haben
ich könnte ja freund von singleton werden aber das wäre ziemlich lapidar
wo liegt mein denkfehler?

ach ja bevor jemand auf das FAQ verweist, ja beide klassen sind im selben header und dort definiert ^^
template< class _MainType > class tPPool : public Singleton< tPPool< _MainType > > { typedef tPPool< _MainType > tTemplateType; public: tPPool() : Singleton() { ... } ... }template < class _MainType > class __declspec(dllexport) Singleton { public: Singleton() { Assert( _MainType == NULL ); my_singleton = static_cast<_MainType*>(this); } virtual ~Singleton( ) { my_singleton = NULL; } __forceinline static _MainType &getSingleton() { Assert( my_singleton ); return my_singleton; } protected: static _MainType* my_singleton; };
-
dir ist schon klar, dass du Klassentemplates und Funktionstemplates nicht in DLLs packen kannst oder? Das geht höchstens bei fertig instantiierten templatefunktionen und selbst da bin ich mir nicht ganz sicher. Wozu also das dllexport etc? lass das alles erstmal weg, genauso das __forceinline und schau obs dann kompiliert.
Bei Zugriff auf Parentmember muss man diese explizit qualifizieren, wenn die Vaterklasse ein abhängiges Template ist, entweder mit this-> oder indem man die Vaterklasse explizit angibt.
-
dir ist schon klar, dass du Klassentemplates und Funktionstemplates nicht in DLLs packen kannst oder?
ja das ist es, aber die nicht template klassen die Singleton nutzen tun es darum das dllexport. ausserdem so denke ich sind templates wohl in einer dll verfügbar sofern ein referenztyp bereits im hauptprogramm verwendet wird.
__forceinline
das forceinline ist zur geschwindigkeits optimierung da diese funktion wirklich sehr oft gecalled wird und somit meines erachtens nach laufzeit gespart wird.
desweiteren hab ich jetzt das inline mal rausgenommen trotzdem selber fehler geblieben also das war nicht der grund ^^Bei Zugriff auf Parentmember muss man diese explizit qualifizieren, wenn die Vaterklasse ein abhängiges Template ist, entweder mit this-> oder indem man die Vaterklasse explizit angibt.
das klingt logisch, das könnte ich mal probieren

-
bekomm ich einen linker error "Nicht aufgelöstes externes Symbol protected: static class tPPool<class XXX> * Singleton<class tPPool<class XXX> >::my_singleton"
irgendwo wirst du my_singleton auch definieren müssen (statische Datenmember werden in einer Klassendefinition bloß deklariert). Das kann und sollte ebenfalls im Header geschehen, damit der Member auch implizit instantiiert wird (wenn irgendeine der gezeigten Memberfunktionen instantiiert wird. Also
template< typename T > T* Singleton<T>::my_singleton = 0;Bezeichner, die mit einem Unterstrich und folgendem Großbuchstaben beginnen, sind im Übrigen für die Implementation des Compiler bzw. der Standardbibliothek reserviert und dürfen sonst nicht verwendet werden.
-
irgendwo wirst du my_singleton auch definieren müssen (statische Datenmember werden in einer Klassendefinition bloß deklariert). Das kann und sollte ebenfalls im Header geschehen, damit der Member auch implizit instantiiert wird (wenn irgendeine der gezeigten Memberfunktionen instantiiert wird. Also
genau das war der knackpunkt, ich hab ganz einfach vergessen die statische variable zu initialisieren ^^
template <> tPPool< XXX >* Singleton < tPPool< XXX > >::my_singleton = NULL;sehr geniale überlegung von dir ich hab den wald vor lauter bäumen nicht mehr gesehen, vielen lieben dank
