Template Klassen, error C2989
-
Hi! Ich bin gerade dabei meinen Code um zu gestallten um die Fehler die ich bei der Planung übersehen hatte zu überarbeiten. Nun bekomme ich einen Fehler welchen ich mir nicht erklären kann, da ich sehr viele andere Klassen habe die exakt genauso aufgebaut sind:
template <class T> class VertexBuffer { public: VertexBuffer(GraphicsDevice* graphicsDevice, unsigned int length); ~VertexBuffer(); T* Data; };Nun spuckt VC++ 2008 folgendes aus:
1>c:\users\tray\documents\visual studio 2008\projects\devia-engine\devia-engine\vertexbuffer.h(14) : error C2989: "VertexBuffer": Klassen-template wurde bereits als Nichtklassen-template deklariert.
1> c:\users\tray\documents\visual studio 2008\projects\devia-engine\devia-engine\graphicsdevice.h(502): Siehe Deklaration von 'VertexBuffer'
1>c:\users\tray\documents\visual studio 2008\projects\devia-engine\devia-engine\vertexbuffer.h(6) : error C3857: "VertexBuffer": Mehrere template-Parameterlisten sind nicht zulässig.Kennt vieleicht jemand diesen Fehler? Ich habe gelesen das dies ein Fehler von VC++ ist, jedoch weiß ich nicht wie man dies beheben kann.
edit von volkard: "[erledigt]" in den titel gebastelt.
edit2: und wieder rausgebastelt.
-
ich rate mal, aber ich bin MSVC-fehlermeldungen nicht mehr gewohnt:
der name VertexBuffer war kacke.
in der graphicsdevice.h in zeile 502 wirde nämlich schon VertexBuffer mit einer anderen bedeutung definiert.
-
1> c:\users\tray\documents\visual studio 2008\projects\devia-engine\devia-engine\graphicsdevice.h(502): Siehe Deklaration von 'VertexBuffer'
Hat sich bereits erledigt, habe ganz übersehen das ich eine forward declaration in einer anderen datei hatte, in der ich den Vertex Buffer noch ohne template declariert habe!
//Edit:
Oh, die Antwort kam zu schnell

-
Hmm, hab da noch eine kleine Frage, wenn wir schon grad beim Thema Templates sind. Wie kann ich dem einem Konstructor ein Template zuweise, ohne einen Parameter vom Typ des Templates zu erwarten?
Also beispielsweise so:
class Bla { public: template<class T> Bla(); };wenn ich nun das Objekt erstelle:
Bla* bla = new Bla<int>();Bekomme ich den Fehler:
error C2512: 'Bla': Kein geeigneter Standardkonstruktor verfügbar
-
Code-Walker schrieb:
Wie kann ich dem einem Konstructor ein Template zuweise, ohne einen Parameter vom Typ des Templates zu erwarten?
Geht nicht.
Als Workaround kannst Du aber ein Dummy-Argument vom Typ T übergeben, welches Du nicht auswertest. Bei primitiven Typen oder leeren Klassen sollte das auch keine Performanceeinbußen zur Folge haben.
class Bla { public: template<class T> Bla( T /* unused_argument */ ); }; struct Tag {}; Bla bla1( int() ); // ruft Bla::Bla<int> auf Bla bla2( Tag() ); // ruft Bla::Bla<Tag> auf
-
Für sowas verwendet man normalerweise boost::type<T>.
-
Ohne mir boost::type angeschaut zu haben, hat der Hinweis gereicht um auch den Workaround für nicht-leere Objekte herzuleiten (was vermutlich boost::type entspräche :)).
Danke hustbaer, manchmal kommt man nicht auf die offensichtlichsten Sachen.