template member function - typ parameter explicit angeben, wie?
-
class Test { template<class A, class B> B my_member_test (A a) { ... // do something fancy } } ... Test t; bool t = true; int x = t.my_member_test(t); // Error int x = t.my_member_test<int, bool> (t); // Error
Also wie kann ich my_member_test richtig aufrufen?
Vielen dank!
-
t gibts zweimal... und schau mal an wierum A und B sind
-
Sorry, nochmal das Beispiel:
class Test { template<class A, class B> B my_member_test (A a) { ... // do something fancy } } ... Test t; bool b = true; bool x = t.my_member_test(b); // Error bool x = t.my_member_test<bool, bool> (b); // Error
Gibt trotzdem Fehler: Im ersten Fall wird die Methode nicht gefunden (ist klar, template arguments können nicht automatisch abgeleitet werden), im zweiten Fall wird der Syntax abgewiesen ("error: expected primary-expression before ‘(’ token
"). Frage: Wie schreibe ich es korrekt?
-
Die zweite Variante sollte aber funktionieren. Gib mal eine komplettes Beispiel was theoretisch compilieren sollte.
Und welchen Compiler benutzt du?
-
Der erste Typ kann vom Compiler nicht erkannt werden, der zweite aber schon. Probiers mal mit einem Template-Parameter beim Aufruf.
-
ok, version 2 kompiliert tatsächlich ...
Das Problem bis mir ist vielmehr, das der Aufruf wiederum in einer template-klasse erfolgt. Also so:
class Test { template<class A, class B> B my_member_test (A a) { ... // do something fancy } } template<class C> class FancyTest { bool test_it(C c) { return c.my_member_test<bool, bool> (true); } } Test t; FancyTest ft; ft.test_it(t);
// error: expected primary-expression before ‘(’ token -- Line 14
-
return c.template my_member_test<bool, bool> (true);
-
davie schrieb:
return c.template my_member_test<bool, bool> (true);
Ja, das klappt! Vielen Dank!
-
davie schrieb:
return c.template my_member_test<bool, bool> (true);
Hast du einen guten Link, wo das erklärt ist? So ein Problem hatte ich auch mal.
-
Hier ein guter Link: http://www.comeaucomputing.com/techtalk/templates/#esprobs - habe ich zwar selbst erst gefunden, aber die Leute von Comeau sollten es richtig gut wissen.
Ansonsten im Standard unter §14.2/4 (für das spezifische x.template foo<int>()-Problem) und §14.6 für die Erklärung, was "abhängige Namen" genau bedeutet.