Suche…


Bemerkungen

  • Eine normale Funktion bezieht sich niemals auf eine Funktionsvorlage, obwohl sie denselben Namen und denselben Typ hat.
  • Ein normaler Funktionsaufruf und ein generierter Funktionsvorlagenaufruf unterscheiden sich, auch wenn sie denselben Namen, denselben Rückgabetyp und dieselbe Argumentliste haben

Was ist das Überladen einer gültigen Funktionsvorlage?

Eine Funktionsvorlage kann nach den Regeln für das Überladen von Nicht-Vorlagenfunktionen (gleicher Name, aber unterschiedliche Parametertypen) überladen werden. Darüber hinaus gilt das Überladen, wenn

  • Der Rückgabetyp ist anders oder
  • Die Vorlagenparameterliste unterscheidet sich, außer der Benennung von Parametern und dem Vorhandensein von Standardargumenten (sie sind nicht Teil der Signatur).

Für eine normale Funktion ist der Vergleich zweier Parametertypen für den Compiler einfach, da er alle Informationen enthält. Ein Typ innerhalb einer Vorlage kann jedoch noch nicht bestimmt werden. Daher ist die Regel, wenn zwei Parametertypen gleich sind, hier annähernd und besagt, dass die nicht abhängigen Typen und Werte übereinstimmen müssen und die Schreibweise der abhängigen Typen und Ausdrücke gleich sein muss (genauer gesagt, sie müssen dem entsprechen sog. ODR-Regeln), mit der Ausnahme, dass Vorlagenparameter umbenannt werden können. Wenn jedoch unter solchen unterschiedlichen Schreibweisen zwei Werte innerhalb der Typen als unterschiedlich angesehen werden, jedoch immer die gleichen Werte vorhanden sind, ist die Überladung ungültig, aber vom Compiler ist keine Diagnose erforderlich.

template<typename T>
void f(T*) { }

template<typename T>
void f(T) { }

Dies ist eine gültige Überladung, da "T" und "T *" unterschiedliche Schreibweisen sind. Folgendes ist jedoch ungültig, es ist keine Diagnose erforderlich

template<typename T>
void f(T (*x)[sizeof(T) + sizeof(T)]) { }

template<typename T>
void f(T (*x)[2 * sizeof(T)]) { }


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow