Adresse einer statischen Memberfunktion
-
Folgendes Problem:
template <typename T> struct Foo { template <void (*Func)(T)> static int bar(int) { return 42; } }; struct Foo2 { template <void (*Func)(double)> static int bar(int) { return 42; } }; template <typename T, void (*Func)(T)> int foobar(int) { } template <typename T, void (*Func)(T)> int (*baz(void))(int) { //return Foo2::bar<Func>; // <-- funktioniert //return foobar<T, Func>; // <-- funktioniert return Foo<T>::bar<Func>; // <-- Fehler! } void thefunc(double) { } int main(void) { int (*func)(int) = baz<double, thefunc>(); }
VC++ 2015 hat keine Schwierigkeiten damit, GCC und Clang allerdings schon:
g++ 5.1 (ideone.com) schrieb:
prog.cpp: In function 'int (* baz())(int)':
prog.cpp:29:29: error: expected primary-expression before ';' token
return Foo<T>::bar<Func>; // <-- Fehler!
^
prog.cpp: In instantiation of 'int (* baz())(int) [with T = double; void (* Func)(T) = thefunc]':
prog.cpp:37:45: required from here
prog.cpp:29:23: error: invalid operands of types '<unresolved overloaded function type>' and 'void (*)(double)' to binary 'operator<'
return Foo<T>::bar<Func>; // <-- Fehler!
^clang 3.7 (ideone.com) schrieb:
prog.cpp:29:33: error: expected expression
return Foo<T>::bar<Func>; // <-- Fehler!
^Ich habe ja erst einen Compilerbug vermutet, aber daß GCC und Clang sich so einig sind, macht mich zögern. Was übersehe ich da nur?
-
vermutlich
return Foo<T>::template bar<Func>;
(ungetestet)
-
Tatsache, es funktioniert. Vielen Dank!
Ich hab ja schon einiges gesehen, aber diese Syntax ist mir noch nie begegnet Wo kommt das her, seit wann gibt es das, wieso braucht man das (najagut, vermutlich aus demselben Grund wie
typename
), und gibt es Dokumentation dazu?
-
Hallo,
gibt es schon immer seitdem es Templates in C++ gibt - nennt sich "Template als Qualifizierer" (template as qualifier), s. z.B im Stroustrup (4. Auflage) im Kapitel C.13.6.
Und wie du richtig vermutest, hat es dieselbe Intention wie 'typename', als Hint an den Compiler.Hier noch ein anderer Online-Link: The template keyword as qualifier
-
Th69 schrieb:
gibt es schon immer seitdem es Templates in C++ gibt - nennt sich "Template als Qualifizierer" (template as qualifier), s. z.B im Stroustrup (4. Auflage) im Kapitel C.13.6.
Danke. Wieder was gelernt