2014-07-04 8 views
6

Il seguente codice è accettato da gcc, vC++ e clang.È conforme allo standard C++ per definire una variabile usando `A <int> :: modello B <int> x;`?

template<class T> 
struct A 
{ 
    template<class U> 
    struct B 
    {}; 
}; 

int main() 
{ 
    A<int>::B<int> y; // OK as expected 
    A<int>::template B<int> x; // Also OK! Is this standard-compliant? 
}; 

Va C++ standard compliant per definire una variabile utilizzando A<int>::template B<int> x;?

+0

B è un modello di tipo dipendente da modello, quindi la seconda sintassi è perfettamente corretta. – Quentin

+0

Potrebbe farmi riferimento alla pagina dello standard che specifica questo utilizzo? Grazie. – xmllmx

+3

@peppe Non è un duplicato, perché non è necessario utilizzare 'template' qui. – juanchopanza

risposta

12

Anche se è una nota non normativo, ritengo una risposta può essere data da n3797 [temp.names]/6

Come è il caso con il prefisso typename, il prefisso template è consentito nei casi in cui non è strettamente necessario; cioè, quando lo specificatore di nome nidificato o l'espressione a sinistra di -> o . non dipende da un parametro di modello o l'uso non appare nell'ambito di un modello.

Nell'esempio del PO, il prefisso template viene utilizzato al di fuori dell'ambito di un modello, e la precedente nested-nome-specificatore non dipende. Pertanto, il prefisso template non è obbligatorio, ma consentito qui.


[expr.prim.general]/8

qualificata id:
        nested-nome-identificatoretemplateopt   non qualificato -id

Inoltre [temp.names]/5

Un nome preceduto dalla parola chiave template deve essere un modello-ido il nome si riferisce ad un modello di classe.

[temp.names]/1 dice che B<int> è davvero un (semplice-) modello-id.

+0

Tutto è valido per C++ 11 +, non per C++ 98/03. Ho ragione? – Constructor

+2

@Constructor In C++ 03, è possibile utilizzare la parola chiave 'template' anche se * nested-type-name * non è dipendente; ma non ti è stato permesso di usarlo al di fuori dell'ambito dei modelli. – dyp

+0

Sì, grazie. – Constructor

Problemi correlati