6

den folgenden Code Gegeben:C++ Überladung hat Vorrang vor Spezialisierung?

#include <iostream> 

using namespace std; 

template<typename T> void Print(T t) { 
    cout << t << endl; 
} 

template<> void Print<int>(int t) { 
    cout << "int = " << t << endl; 
} 

void Print(int i) { 
    cout << "int2 = " << i << endl; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Print(1.3); 
    Print("tese"); 
    Print(2); 

    char c; 

    cin >> c; 

return 0; 
} 

der Anruf Print (2) nicht mehrdeutig Warum ist, sondern Aufruf ungültig Print (int i)?

ps: Getestet mit bcc64.exe und cl.exe.

+1

Da die Überladungsauflösung zuerst die beste Übereinstimmung aus den regulären Funktionen und den primären Vorlagen ermittelt. Erst wenn das erledigt ist, sucht es nach Spezialisierungen. Es gibt einen GOTW-Artikel von Herb Sutter über diese Eigenart. [Hier.] (Http://www.gotw.ca/publications/mill17.htm) – jrok

+0

@jrok und das ist falsch – PierreBdR

+0

@PierreBdR Oh. Es gilt in diesem Fall nicht, ich gebe zu (schlechte Lesart meinerseits) Aber es ist ansonsten korrekt :) – jrok

Antwort

2

Dies liegt daran, dass Nicht-Template-Funktionen erstklassige Bürger sind. Details siehe this article von Herb Sutter oder this SO post.

Von Herb Sutter Artikel:

nichtcodierende Funktionen sind Bürger erster Klasse. Eine einfache alte Nintemplate-Funktion, die den Parametertypen sowie einer beliebigen Funktionsvorlage entspricht, wird über eine ansonsten so gut funktionierende Vorlage ausgewählt.

Wenn es keine erstklassigen Bürger zur Auswahl gibt, die mindestens genauso gut sind, dann werden Funktions-Basis-Vorlagen wie die Bürger der zweiten Klasse als nächstes konsultiert. Welche Funktionsbasisvorlage ausgewählt wird, hängt davon ab, welche am besten passt und ist die "am meisten spezialisierte" (wichtige Anmerkung: diese Verwendung von "spezialisiert" hat merkwürdigerweise nichts mit Vorlagenspezialisierungen zu tun; es ist nur ein unglücklicher Umgangssprache) nach einer Reihe von fair obskuren Regeln:

3

Abschnitt 13.3.3 der Norm, auf die beste Funktion für eine Überlastung der Auswahl weist ausdrücklich darauf hin, dass die Wahl zwischen einem Templat-und einer nicht-Templat-Funktion genau das gleiche Argument Liste gegeben, die nicht -Templated Funktion ist immer eine bessere Passform als die Templates.

-2

Weil Sie es nicht als Print<int> (2) geschrieben haben.

Wenn Sie mit spitzen Klammern schreiben, rufen Sie die Template-Funktion auf. Da Sie die exakte Template-Funktion nicht durch spitze Klammern aufgerufen haben. Es steht nicht in Konflikt mit irgendeinem Anruf Print (any integer); später. Weil die Vorlagenfunktion dort zu diesem Zeitpunkt nicht existiert.

Siehe C++ Arbeitsentwurf Abschnitt Name Resolution unter der Überschrift Templates. Ich hoffe, es hat geholfen.

Verwandte Themen