Si consideri il seguente codice:C++ risoluzione funzione seleziona versione su modelli sopra la funzione pianura
#include <iostream>
template<typename T>
void f(T t)
{
(void)t;
std::cout << "templated f(T)\n";
}
template<typename T>
void entry(T t)
{
f(t);
}
void f(double d)
{
(void)d;
std::cout << "normal f(double)\n";
}
int main()
{
double d = 0.0;
entry(d);
return 0;
}
uscita:
su modelli f (T)
Trovo che questo sorprendente, perché io pensato che la funzione semplice verrà selezionata su qualsiasi versione basata su modelli. Perché succede?
Un'altra cosa che ho notato durante il gioco in giro è che: se metto la funzione normale void f(double)
prima che la funzione su modelli void entry(T)
il codice chiama la funzione normale, in fondo l'output:
normale f (double)
Quindi la mia altra domanda: perché l'ordine è importante in questo particolare esempio?
Ok, ... tuttavia ho notato che la ricerca all'interno di un modello troverà un nome anche * dopo * la dichiarazione del modello se è un altro modello, anche una specializzazione di un modello con un tipo fondamentale come 'double'. Ho verificato ciò cambiando la normale funzione in un modello specializzato: 'template <> void f (double)'. Risultato è chiamato il modello specializzato, anche se è passato il punto di dichiarazione del codice chiamante. – Edenbridge
@Edenbridge La ricerca del nome trova sempre il modello principale. La corrispondenza delle specializzazioni avviene dopo la ricerca del nome e ha una regola diversa: se il modello viene istanziato prima che venga dichiarata la migliore specializzazione parziale corrispondente, allora il programma è mal formato e non è richiesta alcuna diagnostica.In caso di ulteriori dubbi, si prega di inviare una domanda separata. – Brian