1
template<typename T>
class C
{
   void f() { }
};

/*template<typename T>
void C<T*>::f() { }*/

template<>
void C<int*>::f() { }

如果我们删除注释,代码将无法编译。我知道这一点(我也知道,我们应该有partial specializationfor 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 - 代码将无法编译。

4

1 回答 1

1

以下是14.7.3 /1中关于可能明确专门化的内容的标准引用:

以下任何一项的明确专业化:

— 功能模板

— 类模板

类模板的成员函数

— 类模板的静态数据成员

— 类模板的成员类

— 类模板的成员枚举

— 类或类模板的成员类模板

— 类或类模板的成员函数模板

可以通过引入的声明来声明template<>;

除非明确允许,否则您不能部分特化任何东西,并且类模板的成员函数也不是明确允许的。只有类模板可以部分特化(如 14.5.5 中所述)。

(请注意,显式特化类模板的成员类模板本身就是类模板。)

于 2012-09-09T15:14:34.957 回答