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 Klassenvorlage

    Eigentlich 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


Log in to reply