Template Problem mit Visual C++ 6.0
-
Hi,
weiß jemand wie man diesen Code unter Visual C++ 6.0 zum laufen bekommt?
Er compiliert unter g++, Comeau und Visual C++ 7.1 erfolgreich.class Test { }; class Caller { public: template<class Type> Caller(Type* p) { proxy<Type>(); } private: template<class Type> static void proxy() { } }; int main() { Test test; Caller caller(&test); return 0; }
Die Fehlermeldungen lauten:
(10) : error C2275: "Type" : Ungültige Verwendung dieses Typs als Ausdruck (21) : Siehe Deklaration von 'Type' (21) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage '__thiscall Caller::Caller(class Test *)' (10) : error C2059: Syntaxfehler : ')' (21) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage '__thiscall Caller::Caller(class Test *)'
-
Hallo,
der VC 6.0 unterstützt die explizite Angabe von Templateparameter nur für freie Funktionen (und das auch nur fehlerhaft), nicht aber für statische und nicht-statische Memberfunktionen.
Ein gängiger Workaround:class Test { }; class Caller { public: template<class Type> Caller(Type* p) { proxy(Type2Type<Type>()); } private: template <class T> struct Type2Type {}; template<class Type> static void proxy(Type2Type<Type>) { } }; int main() { Test test; Caller caller(&test); return 0; }
-
Hallo HumeSikkins, herzlichen Dank für den Tipp.
Allerdings hatte ich das Beispiel ein bisschen vereinfacht und ich möchte im wirklichen Code einen Zeiger auf die instantiierte Funktion speichern.
Also:
class Test { }; class Caller { public: template<class Type> Caller(Type* p) : pProxyFunction_(proxy<Type>) { } private: void (*pProxyFunction_)(); template<class Type> static void proxy() { } }; int main() { Test test; Caller caller(&test); return 0; }
Könnte man das auch mit dem Type2Type Workaround hinbekommen? Ich habs jedenfalls nicht geschafft.
Ich konnte aber einen anderen Workaround finden und zwar läuft es jetzt, wenn ich noch eine Hilfsklasse nehme und dort dann die statische Memberfunktion unterbringe:
class Test { }; class Caller { public: template<class Type> Caller(Type* p) : pProxyFunction_(Proxy<Type>::call) { } private: void (*pProxyFunction_)(); template<class Type> class Proxy { public: static void call() { }; }; }; int main() { Test test; Caller caller(&test); return 0; }
-
Könnte man das auch mit dem Type2Type Workaround hinbekommen?
Nein. Dieser Workaround hilft nur beim Aufruf von Funktionen. Er wandelt ja die explizite Angabe von Templateparametern in eine implizite Herleitung um. Eine solche implizite Herleitung geschieht aber nur bei einem Funktionsaufruf, nicht aber, wenn du die Adresse einer Funktion bilden willst.
Ich konnte aber einen anderen Workaround finden und zwar läuft es jetzt, wenn ich noch eine Hilfsklasse nehme und dort dann die statische Memberfunktion unterbringe
Das ist auch genau der Ansatz, den ich für den VC 6 Loki-Port verwendet habe.