Sonderfall parameterlose Funktions-Templates und deren Spezialisierung



  • Ich habe hier ein Problem mit dem Verständnis von parameterlosen Funktions-Templates, und deren Spezialisierung

    template< typename Type > void bar() {};
    template< typename Type > void bar(const T& param) {};
    
    int main()
    {
       bar(); // wird wahrscheinlich nicht von allen Compilern übersetzt 
       bar<int>(); // warum so ? - Und wo im C++ Standard definiert?
       bar("Hallo Welt");         // funktioniert ohne Qualifizierung? - most specialized ?!
       bar<char *>("Hallo Welt"); // Ist explizit, kann man auch sagen: lokal spezialisiertes Funktions-Template?
       return 0;
    }
    

    Mir ist das 14.5.5.2 partial ordering of function templates S.300 bekannt wonach immer die most specialized Template-Funktion aufgerufen wird, das erklärt mir aber nicht warum ich bei

    void bar();
    

    einen Typen angeben muss, hat dies etwas mit der ODR zu tun?. Um die Möglichkeit zu haben einen anderen Datentypen mit gleichem Namen einzuführen. 😕

    Ein Haufen Fragen, ich hoffe Ihr könnt helfen. G-DC!


  • Mod

    Antworten in Kapitel 14.8 ff.
    Partielle Ordnung von Funktionstemplates brauchen wir hier gar nicht - da die Funktionen jeweils eine verschiedene Parameterzahl haben, kommen wir gar nicht in die Verlegenheit mehr als eine Kandidatenfunktion für die Überladung zu haben.



  • DeepCopy schrieb:

    das erklärt mir aber nicht warum ich bei

    void bar();
    

    einen Typen angeben muss

    Das Template stellt ja keine Funktion dar, sondern nur eine Schablone, aus der der Compiler selbstständig Funktionen erzeugen kann basierend auf den Template-Typen. Normalerweise leitet er diese aus den Parametern ab. Woher soll er aber beim Aufruf vo bar() wissen, welche Funktion er erzeugen soll, wenn er durch nichts den Template-Typ herleiten kann? Deswegen muss man in dem Fall den Typ explizit angeben, z.B. mit bar<int>().



  • XMaster schrieb:

    DeepCopy schrieb:

    das erklärt mir aber nicht warum ich bei

    void bar();
    

    einen Typen angeben muss

    Das Template stellt ja keine Funktion dar, sondern nur eine Schablone, aus der der Compiler selbstständig Funktionen erzeugen kann basierend auf den Template-Typen. Normalerweise leitet er diese aus den Parametern ab. Woher soll er aber beim Aufruf von bar() wissen, welche Funktion er erzeugen soll, wenn er durch nichts den Template-Typ herleiten kann? Deswegen muss man in diesem Fall den Typ explizit angeben, z.B. mit bar<int>().


Anmelden zum Antworten