template<typename T>
class C
{
void f() { }
};
/*template<typename T>
void C<T*>::f() { }*/
template<>
void C<int*>::f() { }
如果删除注释,代码将无法编译。我知道这一点(我也知道,partial specialization
我们应该有C<T*>
),但我找不到标准中的单词,这解释了这种行为。我重读14 par
标准几次。你能给我一个引用或标准的标准,这可以解释这个吗?
修改
template<typename T>
class C
{
template<typename U>
struct S { };
};
// #1
/*template<typename T>
class C<T*>
{
template<typename U>
struct S { };
};*/
// #2
/*template<typename T>
template<typename U>
struct C<T*>::S<U*> { };*/
template<>
template<typename U>
struct C<int*>::S<U*> { };
如果我们只删除#2旁边的注释 - 代码将无法编译。
答案 0 :(得分:1)
以下是14.7.3 / 1中关于什么可能是专门 expliclitly 的标准引用:
以下任何一项的明确专业化:
- 功能模板
- 班级模板
- 类模板的成员函数
- 类模板的静态数据成员
- 类模板的成员类
- 类模板的成员枚举
- 类或类模板的成员类模板
- 类或类模板的成员函数模板
可以由
引入的声明声明template<>;
除非明确允许,否则不能部分专门化任何内容,并且不明确允许类模板的成员函数。只有部分模板可以部分专用(如14.5.5中所述)。
(请注意,显式专用类模板的成员类模板本身就是一个类模板。)