§14/ 2(强调我的)
template-declaration 只能作为命名空间范围或类出现 范围声明。在函数模板声明中,最后一个 declarator-id 的组件不应是 template-id 。 [ 注意: 最后一个组件可能是标识符, operator-function-id , conversion-function-id 或 literal-operator-id 。在课堂上 模板声明,如果类名是 simple-template-id ,则 声明声明了一个类模板部分特化(14.5.5)。 - 后注]
请注意, declarator-id 在语法(N4140)中定义,如下所示:
声明符-ID :
... opt id-expression
ID-表达:
不合格-ID
qualified-id
不合格-ID :
标识符
操作员功能-ID
转换函数-ID
字面运营商-ID
〜类名
〜 decltype-specifier
template-id
鉴于此,在函数模板声明中, declarator-id 是标识符, operator-function-id , conversion-function-id 或 literal-operator-id ,上面的表达“最后一个组件”是什么意思?
答案 0 :(得分:2)
在语法引用中,您省略了 qualified-id 的制作,该制作扩展为 unqualified-id 的序列,最后一个组件指的是最后一个 unqualified-id 。
标准告诉你 函数模板声明不能以 template-id 结尾 与类模板的部分特化相反
template<typename T> class A {};
template<typename T> class A<std::vector<T> > {}; // ends with simple-template-id
即使功能模板的 qualified-id 的某些组件可能是 template-id ,例如
template<typename>
struct A {
void f();
};
template<typename T>
void A<T>::f() {} // cannot end with template-id