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?
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).
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ändertIn 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% 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.