模板名称和模板ID之间的差异

Tem*_*ast 8 c++ templates

C++标准

第14/2节:

在函数模板声明中,declarator-id应为 模板名称(即,不是 template-id).[ 注意:在类模板声明中,如果 declarator-idtemplate-id,则声明声明类模板部分特化.

是什么之间的区别template-name,template-id以及type-id

以上引用是否意味着我们不能写出类似的东西

template <>
void templatefunction<int>(){ // ...} 
Run Code Online (Sandbox Code Playgroud)

或者我误解了这一点?

Jam*_*lis 29

模板的名称是模板的名称.在您的示例中,templatefunction模板名称.

模板id是在模板参数列表模板的名称.在您的示例中,templatefunction<int>template-id.一个模板id名称模板专业化.

一个类型ID名称的类型.甲模板id是一个类型-ID ; 一个模板名称是不是(因为它没有指定类型,它的名字的模板).

您从14/2引用的文本涉及模板声明,它声明了主模板.您的示例不是模板声明,它是显式特化(14.7.3/1).


Joh*_*itb 6

declarator-id是语法元素,它在simple-declaration("type name;")中指定名称.在下面的"A"和"B :: C"中是声明者id

int A;
int B::C;
int A();
int *A;
int A[42];
template<typename T> void A();
Run Code Online (Sandbox Code Playgroud)

type-id在语法上大致是一个简单的声明,其中缺少declarator-id.type-id用作模板类型参数和强制转换中的语法元素.

int // type-id
int* // type-id
int[] // type-id
int() // type-id
int(*)() // type-id
Run Code Online (Sandbox Code Playgroud)

template-name是模板的名称.从语法上讲,它出现在模板参数列表之前.上面的引用误用"template-name"和"declarator-id",因为template-name是普通标识符,不包含任何限定符.C++ 0x已将文本更改为

在函数模板声明中,declarator-id的最后一个组件应该是template-name或operator-function-id(即,不是template-id).

(最后一部分出现在诸如此类的情况下operator+()).即使是C++ 0x文本也遗漏了一些案例 - 请参阅此缺陷报告.

"声明者身份"的滥用发生在说明中.该注释被C++ 0x替换为

[注意:在类模板声明中,如果类名是... - 结束注释]

在类模板声明中,语法指定的名称是类名而不是声明符.class-name和declarator-id的关系如下(非常简化......)

class class-name { ... } declarator-id;
class foo        { ... } bar;
Run Code Online (Sandbox Code Playgroud)

在类模板声明中,可能没有指定声明符标识.


template-id是模板名称,后跟模板参数列表.


引用意味着在函数模板声明中,名称不能是template-id.在您的示例中,您声明了一个函数而不是模板.但是仍然存在显式特化声明模板的情况.但这只能发生在成员函数模板中

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() { }
Run Code Online (Sandbox Code Playgroud)