2016-03-02 24 views
7

È questo C++ legale?Un parametro di un modello di template template può causare ombreggiamento?

template <typename T, template <typename T> class> 
struct S { }; 

Clang (3.7.1) respinge, lamentano il secondo T ombre primo T. GCC sembra non preoccuparsene e penso che sia ragionevole. Penso che sia solo il numero di parametri che conta in un parametro template template.

+0

perché è necessario utilizzare 'T' due volte? se vuoi usare 'T' nel secondo template puoi scrivere' template class> ' –

+1

@DavidHaim Non è obbligatorio, ma quando si suppone che il primo parametro sia dato al secondo parametro che è un modello di modello, ha senso utilizzare lo stesso nome (o almeno un simile) per il parametro del modello nidificato. Il tuo suggerimento è interessante, non ho mai provato a specificare un parametro predefinito per un parametro template template. Cosa fa rispetto a 'template class>'? – nodakai

+0

Mi chiedo qual è la motivazione di guida per chi fa ricerca e distrugge le parole tag in un titolo di post ?? Forse sono ugualmente entusiasti di sostituire 'NULL' in' nullptr'? – nodakai

risposta

7

No. [temp.local]/6:

A modello-parametro non devono essere dichiarato nuovamente nel suo ambito (compresi scope nidificati).

+0

Hmm, mi ci è voluto un po 'per capire che la tua citazione è effettivamente pertinente al mio caso, ma è vero, è sicuramente un "scope annidato". – nodakai