CRTP und Instanziierung eines Memberfunktion-Templates
-
Hallo zusammen,
Ich würde gerne innerhalb eines CRTP-Konstrukts eine Template-Memberfunktion benutzen, deren Template-Argument sich nicht anhand ihrer Parameter ableiten läßt. Ich gebe also explizit den Typ an, für den die Funktion instanziiert werden soll. Aber seht selbst:
template <typename D> struct Base { void bar() { D & d = *static_cast<D*>(this); d.foo<int>(); // kompiliert nicht! } }; struct Derived : public Base<Derived> { template <typename T> void foo() { } }; int main() { Derived x; x.foo<int>(); // funktioniert! x.bar(); }Mein gcc sagt dazu:
test.cc: In member function ‘void Base<D>::bar()’: test.cc:5: error: expected primary-expression before ‘int’ test.cc:5: error: expected ‘;’ before ‘int’Daraus werde ich nicht wirklich schlau. Wie man sieht kann ich die Funktion anderswo problemlos auf die selbe Weise aufrufen, also warum nicht dort in der Basisklasse?
Danke schonmal im Voraus!
-
Der Compiler kann an der Stelle nicht ableiten, was foo ist. Änhlich wie bei der Notwendigkeit von typename in manchen Fällen musst du hier sagen, dass foo ein template ist und das nachfolgende < also einen Templateparameter einleitet und zum Beispiel kein Kleiner-Operator ist. Also:
d.template foo<int>();
-
Ahh... Tausend Dank für die schnelle Antwort.
Jetzt wo ich das sehe kommt es mir auch wieder irgendwie bekannt vor. Mein C++ ist wohl nach zwei Jahren unfreiwilliger Java-Programmierung doch etwas eingerostet.