Problem mit eigener SmartPointerKlasse
-
template <bool OnlyOnTheHEAP> class DLL Base; template <> class DLL Base<true> { protected: virtual inline void del(){} private: inline ~Base(){} public: Base(){} virtual void destroy(){del(); delete this;} }; template <class T> class DLL SmartDecoState : public Base<true> { private: template <class T> struct DLL Traits { enum{result = false}; }; template <class T> class DLL Traits<T*> { enum{result = true}; }; enum {result = Traits<T>::result}; Cipher* refcount; protected: T* ptr; public: //... virtual void del(); inline void newptr(T* nptr, Cipher* nref); //... }; class Item; class DLL ItemAdmin : public Base<true> { private: //... std::vector<Item*> Items; public: //... inline void pop(SmartDecoState<Item*>* ptr) { ptr->newptr(&Items.back(), new Cipher(1)); //hier beginnt //der Fehler std::vector<Item*>::iterator itr = Items.end(); itr--; Items.erase(itr); } }; template <class T> void SmartDecoState<T>::del() //und hier machts bumm { if(*refcount == 1) { if(result) { (*ptr)->destroy(); } else { ptr->destroy(); } delete refcount; } else { (*refcount)--; } }
Sorry für den langen Quellcode. Ich bekomme mit VC++ folgenden Fehler:
d:\datein daniel\c++ programmieren\pn\aktuelles projekt\version0.6\pnmodel\smartfunctions.h(97) : error C2227: Der linke Teil von '->destroy' muss auf Klasse/Struktur/Union zeigen
d:\altdaten c\programme\microsoft visual studio\vc98\include\xmemory(59) : Bei der Kompilierung der Member-Funktion 'void __thiscall PNFramework::SmartDecoState<class PNFramework::Model::Item *>::del(void)' der KlassenvorlageEigentlich dürfte kein Fehler auftauchen, denn die Traits sind aus Modern C++ Design. Es steht fest, dass der pointeetyp ein Pointertyp ist. Daher müsste Result true sein und deshlab destroy auf den Item und nicht auf dem Pointer auf das Item ausgeführt werden.
Was ist falsch?
-
aus
template <class T> class DLL Traits<T*> { enum{result = true}; };
würde ich
template <class TT> struct DLL Traits<TT*> { enum{result = true}; };
machen.
-
//edit