Eine Deklarator-ID ist das syntaktische Element, das den Namen in einer einfachen Deklaration ("Typname;") angibt. Im folgenden "A" und "B :: C" ist der declarator-id
int A;
int B::C;
int A();
int *A;
int A[42];
template<typename T> void A();
A-Typ-ID syntaktisch ist etwa eine einfach Erklärung, wo die declarator-ID fehlt. Eine Typ-ID wird als syntaktisches Element in einem Schablonetypargument und in einer Besetzung verwendet.
int // type-id
int* // type-id
int[] // type-id
int() // type-id
int(*)() // type-id
Ein Template-Name 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 um den Text zu
In Abhängigkeit Template-Deklaration, die letzte Komponente des declarator-ID soll sein, eine Template-Namen oder die Bediener-ID-Funktion (dh keine Templat-ID) geändert hat .
(Der letzte Teil erscheint in Fällen wie operator+()
). Sogar der C++ 0x Text vermisst einige Fälle - siehe this defect report.
Der Missbrauch von "declator-id" passiert in der Notiz. Die Note wurde mit
von C++ 0x ersetzt
[Anmerkung: in einer Klasse Template-Deklaration, wenn der Klassenname ist ein ... - Endnote]
In Klassenvorlage Erklärungen, die Der syntaktisch angegebene Name ist ein Klassenname anstelle einer Deklarator-ID. Die Beziehung des Klassennamen und declarator-ID ist wie folgt (sehr vereinfachte ...)
class class-name { ... } declarator-id;
class foo { ... } bar;
In Klassenvorlage Erklärungen gibt keine declarator-ID angegeben werden.
Eine Vorlagen-ID ist ein Vorlagenname gefolgt von einer Vorlagen-Argumentliste.
Das Zitat bedeutet, dass in einer Funktion Vorlage Erklärung muss der Name nicht ein Template-ID sein. In Ihrem Beispiel deklarieren Sie anstelle einer Vorlage eine Funktion.Es gibt jedoch immer noch Fälle, in denen eine explizite Spezialisierung eine Vorlage deklariert. Aber das kann nur für Elementfunktionsvorlagen passieren
template<typename T>
struct A {
template<typename U>
void f();
};
// this explicit specialization *contains* a template declaration and
// declares an identifier (a template-name) qualified by A<int>::
template<> template<typename U>
void A<int>::f() { }