Probleme bei Implementierung einer Methode
-
Zur Zeit habe ich ein Problem bei der Implementierung einer Methode außerhalb der Klasse. Innerhalb funktionierts. Ich habe den Code in 3 Compilern getestet. Im Borland C++ Builder 5 und im Visual C++ 6 geht's nicht, beim Visual Studio 2003/2005 schon. Aber hier erstmal mein Code:
class C_KLASSE { public: template<class Type> void Methode(Type *Object, void(Type::*Pt2Method)(void)); }; template<class Type> C_KLASSE::Methode(Type *Object, void(Type::*Pt2Method)(void)) { (Object->*Pt2Method)(); }Hier bringt mir der Borland folgende Fehlermeldung
[C++ Fehler]Unit1.cpp(15):E2316 'C_KLASSE::Methode(Type ,void(struct::)())' ist kein Element von 'C_KLASSE'
und der Visual 6 kann den Code nicht auflösen (unresolved External). Wie schon gesagt, innerhalb der Klasse funktioniert es einwandfrei aber ich will nur sehr ungern eine Zeile Code in meine Header eintragen (um genau zu sein will ich es überhaupt nicht).
Ich bedanke mich schon mal im Voraus für jegliche Hilfe.
-
Templates müssen im Header definiert sein, sonst findet der Linker sie nicht wieder (bzw. der Compiler weiß nicht, für welche Typen er das Template bauen soll).
-
Hm, najut, des nervt zwar ein wenig aber wenn's net anders geht...
Aber dennoch Danke!
-
Hm.... Penis.....
Ich glaub der CStoll hat recht

-
Gibt's dann vielleicht zumindest eine Möglichkeit einen Zeiger auf eine Methode nach
void(*Pt2Method)(void);zu casten? Das würde nämlich auch helfen...
-
du musst schon angeben, wozu der template parameter gehört:
template<class Type> C_KLASSE::Methode<Type>(Type *Object, void(Type::*Pt2Method)()) { (Object->*Pt2Method)(); }casten willst du nicht, das wäre vollkommen sinnlos.
-
Der Standard hat noch export beschert, was aber bei den meisten Compilern noch nicht umgesetzt ist!
-
jup dürfte gehen...
-
Hmm... export. Hab' zwar schon davon im Bezug auf DLLs gehört, aber weiß nicht wie man es verwendet. Kann mir das wirklich bei meinem Problem helfen?
-
wenn ich deinen Code verwende
template<class Type> C_KLASSE::Methode<Type>(Type *Object, void(Type::*Pt2Method)()) { (Object->*Pt2Method)(); }dann bringt er mir diese Fehlermeldung:
[C++ Fehler]Unit1.cpp(8) E2449 Größe von 'Methode' unbekannt oder Null
Wenn's jetzt net anders klappt mach ich's wie CStoll gemeint hat. Aber trotzdem Danke an alle die mir hier helfen wollten.
-
Guck mal hier, da ist auch ein Beispiel für Methodenpointer, vllt. hilfts dir weiter (da ist der Funktionszeiger als Templateparameter angegeben):
http://www.c-plusplus.net/forum/viewtopic-var-t-is-128053.html