2014-05-05 18 views
5
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++

+1

@ πάνταῥεῖ: Non sono sicuro di come ciò si riferisca a questa domanda. –

+0

@OliCharlesworth I was not neanche;) ... Pensa che il commento di dyp corrisponde meglio a quello che volevo esprimere. –

+8

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

risposta

1

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.

+2

Penso che 'foo (a, b)' esegua ancora la risoluzione di sovraccarico e utilizza solo la seconda funzione perché quella è più specializzata. – dyp

+0

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

+0

@ dyp Penso che tu abbia ragione. Grazie per aver segnalato l'errore. Aggiornato la mia risposta. –