2014-07-04 13 views
6

Der folgende Code wird von gcc, vC++ und clang akzeptiert.Ist es C++ -Standard-konform, eine Variable mit `A <int> :: template B <int> x;` zu definieren?

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? 
}; 

Ist es C-Standard-konform ++ eine Variable zu definieren A<int>::template B<int> x; verwenden?

+0

B ist eine Vorlage Vorlage-abhängigen Typ, so ist die zweite Syntax vollkommen korrekt. – Quentin

+0

Können Sie mich auf die Seite der Norm verweisen, die diese Verwendung angibt? Vielen Dank. – xmllmx

+3

@peppe Kein Duplikat, da Sie hier nicht 'template' verwenden müssen. – juanchopanza

Antwort

12

Auch wenn es sich um eine nicht-normative Notiz ist, glaube ich, eine Antwort kann durch n3797 [temp.names]/6

gegeben werden, wie der Fall mit dem Präfix typename ist, das template Präfix erlaubt in Fällen, in denen dies nicht unbedingt notwendig ist; wenn der verschachtelte Name-Spezifizierer oder der Ausdruck auf der linken Seite der -> oder . nicht von einem Template-Parameter abhängig ist, oder die Verwendung nicht im Bereich einer Vorlage erscheint.

In dem Beispiel des OP, das Präfix template liegt außerhalb des Umfangs der Schablone und der vorangehende nested-name-Spezifizierer ist nicht abhängig eingesetzt. Daher wird das Präfix template nicht benötigt, aber hier erlaubt.


[expr.prim.general]/8

qualifizierte Nummer:
        verschachtelten-name-specifiertemplateopt   unqualifizierte -id

Plus [temp.names]/5

Ein Name durch das Schlüsselwort voran template soll sein ein Template-id oder der Name einer Klassenvorlage verweisen soll.

[temp.names]/1 sagt, dass B<int> ist in der Tat ein (Einfach-) Template-id.

+0

Es ist alles gültig für C++ 11 +, nicht für C++ 98/03. Habe ich recht? – Constructor

+2

@Constructor In C++ 03 können Sie das Schlüsselwort 'template' verwenden, auch wenn der * verschachtelte_Typname * nicht davon abhängig ist; aber Sie durften es nicht außerhalb der Vorlagen verwenden. – dyp

+0

Ja, danke. – Constructor