template<typename TA, typename TB>
void foo (TA a, TB b); // #1
template<typename T>
void foo (T a, T b); // #2
int a, b;
foo(a, b);
In questo caso, viene chiamato foo # 2. Perché?Selezione funzione template C++
template<typename TA, typename TB>
void foo (TA a, TB b); // #1
template<typename T>
void foo (T a, T b); // #2
int a, b;
foo(a, b);
In questo caso, viene chiamato foo # 2. Perché?Selezione funzione template C++
Se si dovesse fare espliciti i parametri del modello, si dovrebbe utilizzare:
foo<int, int>(a, b);
per chiamare la prima funzione.
Si potrebbe utilizzare:
foo<int>(a, b);
per chiamare la seconda funzione.
Dato che il compilatore ha scelto la funzione, ha scelto la funzione più restrittiva, che è la seconda.
Perché il secondo è più restrittivo? Il compilatore deve dedurre un tipo per utilizzare la seconda funzione. Deve dedurre due tipi per utilizzare il primo.
Penso che 'foo
IMO il secondo è * più * restrittivo, ergo * più specializzato *: deduce il tipo per entrambi gli argomenti singolarmente, e se i tipi dedotti non sono gli stessi, la deduzione fallisce. – dyp
@ dyp Penso che tu abbia ragione. Grazie per aver segnalato l'errore. Aggiornato la mia risposta. –
@ πάνταῥεῖ: Non sono sicuro di come ciò si riferisca a questa domanda. –
@OliCharlesworth I was not neanche;) ... Pensa che il commento di dyp corrisponde meglio a quello che volevo esprimere. –
In questo caso, entrambi i modelli producono una firma della funzione 'void foo (int, int)', quindi sono selezionati in base a un * ordinamento parziale * alias * che è più specializzato *. – dyp