Anbetracht dieser Code:C++ Funktionsschablone Spezialisierung und Überlastungen
template <class T>
void f(T p) { //(1)
cout << "Second" << endl;
}
template <>
void f(int *p) { //(2)
cout << "Third" << endl;
}
template <class T>
void f(T* p) { //(3)
cout << "First" << endl;
}
Ein Aufruf wie int *p; f(p);
ausgeben wird First
.
Wenn die Reihenfolge der Erklärungen geändert wird, wie folgt aus:
template <class T>
void f(T* p) { //(3)
cout << "First" << endl;
}
template <class T>
void f(T p) { //(1)
cout << "Second" << endl;
}
template <>
void f(int *p) { //(2)
cout << "Third" << endl;
}
der gleiche Anruf (int *p; f(p);
) ausgibt Third
.
las ich über die Art und Weise, in der Funktionsschablone Überladungsauflösung Orte nimmt: zuerst die Auflösung nur Nicht-Template-Funktionen betrachtet und die zugrunde liegenden Basisvorlagen. Nachdem die "am meisten spezialisierte" ausgewählt wurde, wird diese Spezialisierung aufgerufen, wenn es eine Template-Funktion ist und eine Spezialisierung für die Parameter hat, die abgeleitet (oder explizit spezifiziert) wurden.
Jetzt ist meine Frage: wie wird entschieden für welche zugrundeliegende Basisvorlage eine Funktion ist eine Spezialisierung? In meinem Beispiel, für welche Funktion Vorlage Überladung ((1) oder (3)) ist (2) eine Spezialisierung?
Meine Vermutung ist, dass wenn eine Spezialisierung deklariert wird, die bereits deklarierten Templates berücksichtigt werden, und von denen die "spezialisierten" (deren Parameter dieser Spezialisierung "am nächsten kommen") ausgewählt werden. Ist das richtig? Könnten Sie mich auch darauf hinweisen, wo dies im Standard angegeben ist?
Also, von den Template-Funktionen vor der Spezialisierung deklariert, wird die "richtige" mit Teilbestellung gewählt? – user42768
@ user42768 - Nach Vorlage Argumentableitung * und * teilweise Bestellung, ja. – StoryTeller