C++标准
第14/2节:
在函数模板声明中,declarator-id应为 模板名称(即,不是 template-id).[ 注意:在类模板声明中,如果 declarator-id是 template-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).
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)
| 归档时间: |
|
| 查看次数: |
4878 次 |
| 最近记录: |