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!
-
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>().