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?


  • Mod

    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 🙂


Log in to reply