Unterschied zwischen Vorlagenname und Vorlagen-ID

8

C ++ Standard

  

Abschnitt 14/2:

     

In einer Funktionsschablonen-Deklaration   Die declarator-id muss a sein    Vorlagenname (d. h. nicht a    Vorlagen-ID ). [ Hinweis: in einer Klasse   Vorlage Deklaration, wenn die    declarator-id ist eine Template-ID , die   Deklaration deklariert eine Klasse   Vorlage teilweise Spezialisierung.

Was ist der Unterschied zwischen einem template-name , template-id und einem type-id ?

Bedeutet das obige Zitat, dass wir etwas nicht schreiben können wie

%Vor%

oder habe ich den Punkt missverstanden?

    
TemplateEnthusiast 26.09.2010, 04:07
quelle

3 Antworten

29

Der Vorlagenname ist der Name der Vorlage. In Ihrem Beispiel ist templatefunction ein Vorlagenname .

Die Vorlagen-ID ist der Name der Vorlage mit der Liste der Vorlagenargumente. In Ihrem Beispiel ist templatefunction<int> die Vorlagen-ID . Eine Template-ID benennt eine Template-Spezialisierung.

Eine Typ-ID benennt einen Typ. Eine Template-ID ist eine Type-ID ; Ein Schablonenname ist nicht (weil er keinen Typ angibt; er benennt eine Vorlage).

Der von Ihnen zitierte Text bezieht sich auf eine Template-Deklaration , die eine primäre Vorlage deklariert. Ihr Beispiel ist keine Template-Deklaration , sondern eine explizite Spezialisierung (14.7.3 / 1).

    
James McNellis 26.09.2010 04:12
quelle
6

Eine Deklarator-ID ist das syntaktische Element, das den Namen in einer einfachen Deklaration ("Typname;") angibt. Im Folgenden ist "A" und "B :: C" die Deklarator-ID

%Vor%

Eine Typ-ID ist syntaktisch eine einfache Deklaration, in der die Deklarator-ID fehlt. Eine Typ-ID wird als syntaktisches Element in einem Schablonetypargument und in einer Besetzung verwendet.

%Vor%

Ein Vorlagenname ist der Name einer Vorlage. Syntaktisch erscheint es vor einer Template-Argumentliste. Das obige Zitat missbraucht "Schablonenname" und "Deklarator-ID", weil ein Schablonenname ein einfacher Bezeichner ist und keine Qualifikationsmerkmale enthält. C ++ 0x hat den Text in

geändert
  

In einer Funktionsschablonendeklaration muss die letzte Komponente der Deklarator-ID ein Vorlagenname oder eine Operatorfunktions-ID sein (d. h. keine Vorlagen-ID).

(Der letzte Teil erscheint in Fällen wie operator+() ). Sogar der C ++ 0x Text vermisst einige Fälle - siehe diesen Fehlerbericht .

Der Missbrauch von "declator-id" passiert in der Notiz. Die Notiz wurde durch C ++ 0x mit

ersetzt
  

[Hinweis: Wenn in einer Klassenschablonendeklaration der Klassenname eine ... - Endnote ist]

In Klassenschablonendeklarationen ist der syntaktisch angegebene Name ein Klassenname anstelle einer Deklarator-ID. Die Beziehung von Klassenname und Deklarator-ID ist wie folgt (sehr vereinfacht ...)

%Vor%

In Klassenschablonendeklarationen ist möglicherweise keine Deklarator-ID angegeben.

Eine Vorlagen-ID ist ein Vorlagenname gefolgt von einer Vorlagen-Argumentliste.

Das Zitat bedeutet, dass in einer Funktion Vorlage -Deklaration der Name keine Vorlage-ID sein darf. In Ihrem Beispiel deklarieren Sie eine Funktion anstelle einer Vorlage. Es gibt jedoch immer noch Fälle, in denen eine explizite Spezialisierung eine Vorlage deklariert. Aber das kann nur für Memberfunktionsvorlagen passieren

%Vor%     
Johannes Schaub - litb 26.09.2010 10:34
quelle
2

Von C++ Templates: The Complete Guide Von David Vandevoorde, Nicolai M. Josuttis

8.3

  

Explizite Vorlagenargumente : Auf einen Vorlagennamen können explizite Vorlagenargumentwerte in spitzen Klammern folgen. Der resultierende Name wird als Template-ID bezeichnet.

Zum Beispiel:

%Vor%
  

In einer Funktionsschablonendeklaration muss die Deklarator-ID ein Vorlagenname (d. h. keine Vorlagen-ID) sein.

Zum Beispiel (aus dem, was ich verstanden habe):

%Vor%

Jemand korrigiert mich bitte, wenn ich falsch liege.

    
Prasoon Saurav 26.09.2010 05:57
quelle

Tags und Links