6

Dato il seguente codice:Sovraccarico C++ ha la precedenza su Specializzazione?

#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; 
} 

Perché la chiamata di stampa (2) non ambiguo, ma invece chiamare Stampa void (int i)?

ps: Testato con bcc64.exe e cl.exe.

+1

Poiché la risoluzione del sovraccarico preleva la migliore corrispondenza dall'insieme di funzioni regolari e modelli primari. Solo quando ciò è fatto, cerca delle specializzazioni. C'è un articolo su GOTW di Herb Sutter su questa stranezza. [Qui.] (Http://www.gotw.ca/publications/mill17.htm) – jrok

+0

@jrok e questo non è corretto – PierreBdR

+0

@PierreBdR Oh. Non si applica in questo caso, ammetto (lettura errata da parte mia) Ma è corretto altrimenti :) – jrok

risposta

2

Questo perché le funzioni non di modello sono cittadini di prima classe. Vedi this article di Herb Sutter o this SO post per i dettagli.

Dall'articolo di Herb Sutter:

funzioni Nontemplate sono cittadini di prima classe. Una semplice vecchia funzione nontemplate che corrisponde ai tipi di parametri e qualsiasi modello di funzione verrà selezionata su un modello di funzione altrimenti-appena-buono.

Se non ci sono cittadini di prima classe tra cui scegliere che siano almeno altrettanto buoni, i modelli di base delle funzioni come i cittadini di seconda classe vengono consultati successivamente. Il modello di base della funzione che viene selezionato dipende da quali corrispondenze sono migliori ed è il "più specializzato" (nota importante: questo uso di "specializzato" stranamente non ha nulla a che fare con le specializzazioni dei modelli, è solo uno sfortunato colloquialismo) secondo un insieme di regole arcane:

3

Sezione 13.3.3 dello standard, sulla scelta della migliore funzione per un sovraccarico, esplicitamente afferma che, data la scelta tra una su modelli e una funzione non su modelli con la stessa identica lista degli argomenti, la non -la funzione basata su un modello è sempre più adatta rispetto a quella basata su modelli.

-2

Perché non lo hai scritto come Print<int> (2).

Scrivendolo con parentesi angolari significa che stai richiamando la funzione modello. Dal momento che non hai chiamato la funzione esatta del modello scrivendo parentesi angolari. Non è in conflitto con nessuna delle chiamate Print (any integer); successive. Perché la funzione template non esiste lì in quel momento.

Vedere la sezione di bozza di lavoro C++ Name Resolution sotto la voce Templates. Spero che sia stato d'aiuto.