声明符id是在简单声明("type name;")中指定名称的语法元素。在下面的"A“和"B::C”中,声明符-id
代码语言:javascript运行复制int A;
int B::C;
int A();
int *A;
int A[42];
template
代码语言:javascript运行复制int // type-id
int* // type-id
int[] // type-id
int() // type-id
int(*)() // type-id模板名是模板的名称。从语法上讲,它出现在模板参数列表的前面。上面的引号误用了“模板名称”和“声明者id”,因为模板名是一个普通的标识符,不包含任何限定符。C++0x已将文本更改为
在函数模板声明中,声明符id的最后一个组件应该是模板名称或运算符函数id(即,不是模板id)。
(最后一部分出现在operator+()这样的例子中)。甚至C++0x文本也漏掉了一些案例--参见这份缺陷报告。
错误的“声明者-id”发生在说明中。这张便条被C++0x替换为
注意:在类模板声明中,如果类名是.-结束注释
在类模板声明中,在语法上指定的名称是类名称,而不是声明符id。类名和声明符id的关系如下(非常简化.)
代码语言:javascript运行复制class class-name { ... } declarator-id;
class foo { ... } bar;在类模板声明中,可能没有指定声明符id。
模板id是模板名称,后面是模板参数列表。
引号意味着在函数模板声明中,名称不能是模板id。在您的示例中,您声明了一个函数而不是一个模板。但是,仍然存在显式专门化声明模板的情况。但是,这种情况只能发生在成员函数模板上。
代码语言:javascript运行复制template
struct A {
template
void f();
};
// this explicit specialization *contains* a template declaration and
// declares an identifier (a template-name) qualified by A
template<> template
void A