2015-10-03 11 views
5

Questo codice è ben formato? La dichiarazione del modello di funzione fornisce un errore sia in clang che in gcc anche se lo Ts potrebbe essere vuoto.Espansioni di pacchetti multipli all'interno della classe con un numero fisso di argomenti modello

// error: too many template arguments for class template 'pair' 
template<class I, class U, class... Ts> 
void f(std::pair<I,U,Ts...>); 

int main() 
{ 
    f(std::pair<int,int>()); 
} 

La chiamata di funzione dà questo errore nel GCC, che non ha senso. Non v'è alcuna conversione a int:

note: cannot convert 'std::pair<int, int>()' (type 'std::pair<int, int>') to type 'int' 
+0

Provate std :: tuple invece di std :: pair quando si usano più di 2 arg. –

risposta

4

[temp.res]/8:

Se ogni specializzazione valido di un modello di variadic richiede un parametro pacchetto modello vuoto, il modello viene mal formati , non è richiesta la diagnostica .

Ogni specializzazione valida di f richiederebbe un pacchetto vuoto Ts. Pertanto il programma è NDR malformato. Entrambi i compilatori sono corretti.

Per quanto riguarda la diagnostica di GCC, sembra essere dovuto alla sua abitudine di utilizzare int come segnaposto per "qualcosa che assomiglia ad un tipo ma non ha senso" ai fini del recupero degli errori.

Problemi correlati