C
Simon2 schrieb:
camper schrieb:
...Ein Funktionstemplate ist eben etwas völlig anderes als eine Templatefunktion....
Ist diese Nomenklatur eigentlich verbreitet/standardisiert ?
Ich erinnere mich nur daran, dass man "Funktions-/Klassentemplate" sagen sollte für
template <typename T>
void f(void);
template <typename T>
class C;
und nicht "Templatefunktion/-klasse" (um eben klarzustellen, dass es eine Schablone ist).
Das, was der Compiler daraus macht, kenne ich nur als "Instanz" eines (Funktions-/Klassen-)Templates.
Mir fällt allerdings gerade nicht ein, wo ich das gelesen haben (Sutter ? Vandevoorde/Josuttis ? ...)
Gruß,
Simon2.
Man könnte sagen, dass sie standardisiert ist, weil sie bereits in der Sprachdefinition angelegt ist. Die Verwirrung entsteht für den Anfänger vor allem dadurch, dass man (gerade am Anfang in einfachen Fällen ohne Spezialisierung) häufig einfach ein Funktionstemplate definiert, und anschließend ganz normale Funktionsaufrufe (ohne explizite Angabe der Argumente) durchführt. So entsteht natürlich leicht der Eindruck, dass das, was definiert wurde, bereits eine Funktion ist. Denn der Vorgang der Deduktion der Templateargumente und die Instantiierung für diese Argumente ist ja völlig automatisch und implizit. Außerdem gibt es ja beide Begriffe, die des Funktionstemplates als auch der Templatefunktion, die zudem in einem Zusammenhang stehen und daher auch häufig gemeinsam in einem Text auftauchen. Letzteres Problem betrifft dann auch Klassentemplates bzw. Templateklassen (als die konkreten Instanzen eines Klassentemplates). Im Grunde ist es ganz einfach: ein Template ist etwas, das noch durch Parameter näher bestimmt werden muss, und wir nennen es entweder Funktions- oder Klassentemplate, je nachdem, was durch diese Vorlage generiert werden soll, während eine Klasse bzw. Funktion eben gerade keine solchen (Template-)Parameter hat, und wir nennen das dann eine Templateklasse bzw. -funktion, um anzuzeigen, dass dieses Etwas auf ein Template zurückgeht. Wichtig wird diese Unterscheidung noch bei expliziten Templatespezialisierungen. Eine explizite Templatespezialisierung ist kein Template. Das hat wesentliche Auswirkungen auf die ODR. Ein Funktionstemplate muss (nach dieser Lösungsmöglichkeit aus den vorhergehenden Beiträgen) in jeder Übersetzungseinheit definiert werden, in der es gebraucht wird. Eine explizite Spezialisierung dieses Templates ist dagegen eine Funktion und hat damit linkage und unterliegt folglich der ODR (also nur eine Definition im Programm bei extern, es sei denn, wir machen sie inline).