Template abliten von abstrakter (template)-klasse



  • Hallo,

    ich stosse wieder auf probleme beim erstellen meiner Templates.
    Ich habe mirt eine abstrakte (template)-Klasse erstellt und leite davon eine andere ab. leider bekomme ich immer einen Fehler, den ich nicht weg bekomme.

    template <class T>
    class TVertexBuffer
    {
    	protected:
    		T* pVertices;
    		unsigned int iVertices;
    	public:		
    		TVertexBuffer();
    		virtual unsigned int create(unsigned int iVertices, unsigned char iVertexSize, DWORD iVertexFormat) = 0;
    		virtual void *lock(unsigned int iOffset, unsigned int iSize, DWORD iLockFlags)= 0;
    		virtual void unlock() = 0;
    
    };
    

    davon leite ich nun eine klasse ab:

    template <class T>
    class TDXVertexBuffer : public TVertexBuffer<T>
    {
    	public:
    		TDXVertexBuffer();
    		virtual HRESULT create(unsigned int iVertices, DWORD iVertexFormat);
    		virtual void *lock(unsigned int iOffset, unsigned int iSize, DWORD iLockFlags) { int i = 10;}
    		virtual void unlock() { int i = 10;}
    
    };
    template <class T>
    HRESULT TDXVertexBuffer<T>::create(unsigned int iVertices, DWORD iVertexFormat)
    {
    // .....Code ....
    }
    


  • ..
    wenn ich nun (in meinem hauptprogramm 😉 ) mittels

    TDXVertexBuffer<cVertexTex> oVB;

    versuche eine Instanz zu erzeugen, bekomme ich immer die Fehlermeldung:
    error C2259: 'TDXVertexBuffer<T>': Instanz von abstrakter Klasse kann nicht erstellt werden with [ T=cVertexTex ]

    verstehe ich nicht. die klasse TDXVertexBuffer ist doch die abgeleitete. und da sind alle funktionen implementiert; also keine abstakte klasse.

    was mache ich falsch?


  • Mod

    was ist mit

    virtual unsigned int create(unsigned int iVertices, unsigned char iVertexSize, DWORD iVertexFormat) = 0;
    


  • hatte das noch aus versehen im code wegen den vielen änderungn und hin/her-kopiereri drin.
    habs schon geändert, gibt aber immer noch den fehler.

    lustig ist es wenn ich nun nur das

    : public TVertexBuffer<T>
    

    aus der Zeile

    class TDXVertexBuffer : public TVertexBuffer<T>
    

    wegnehme. funktioniert es. sobald ich ableite nimmer.



  • template <class T>
    class TVertexBuffer
    {
    	protected:
    		DWORD iFVFFormat;
    		T* pVertices;
    		unsigned int iVertices;
    		//unsigned char iVertexSize, iColorSize;
    	public:		
    		TVertexBuffer();
    		virtual unsigned int create(unsigned int iVertices, unsigned char iVertexSize, DWORD iVertexFormat) = 0;
    		virtual void *lock(unsigned int iOffset, unsigned int iSize, DWORD iLockFlags)= 0;
    		virtual void unlock() = 0;
    
    };
    
    template <class T>
    class TDXVertexBuffer : public TVertexBuffer<T>
    {
    	public:
    		TDXVertexBuffer() {}
    		virtual unsigned int create(unsigned int iVertices, DWORD iVertexFormat);
    		virtual void *lock(unsigned int iOffset, unsigned int iSize, DWORD iLockFlags) { int i = 10; return(NULL); }
    		virtual void unlock() { int i = 10;}
    
    };
    
    template <class T>
    unsigned int TDXVertexBuffer<T>::create(unsigned int iVertices, DWORD iVertexFormat)
    {
    
    /*	HRESULT iErrorCode;
    	this->iFVFFormat  = iVertexFormat;
    	unsigned int iSize = iVertexSize * iVertices;
    	if (pVertices != NULL)
    		delete[] pVertices;
    	pVertices = new T[iVertices];
    	//pColors = new unsigned char[iVertices * iColorSize];
    	this->iVertices = iVertices;
    	iErrorCode = ((cDX_Device *)pGfxDevice)->pDevice->CreateVertexBuffer(iSize, D3DUSAGE_WRITEONLY, iVertexFormat,
                D3DPOOL_MANAGED, &oVB, NULL );
    	return(iErrorCode);*/
    	return(0);
    }
    

    im Hauptprogramm dann:

    TDXVertexBuffer<cVertexTex> oVB;
    


  • virtual unsigned int create(unsigned int iVertices, unsigned char iVertexSize, DWORD iVertexFormat) = 0;
    ...
            virtual unsigned int create(unsigned int iVertices, DWORD iVertexFormat);
    

    Was fällt dir auf?



  • arggs ich däm.......

    hab ich irgendwie völlig übersehen.
    danke dir für die schnelle hilfe


Anmelden zum Antworten