成员模板专业化

时间:2012-09-09 14:54:09

标签: c++ templates template-specialization partial-specialization

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旁边的注释 - 代码将无法编译。

1 个答案:

答案 0 :(得分:1)

以下是14.7.3 / 1中关于什么可能是专门 expliclitly 的标准引用:

  

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

     

- 功能模板

     

- 班级模板

     

- 类模板的成员函数

     

- 类模板的静态数据成员

     

- 类模板的成员类

     

- 类模板的成员枚举

     

- 类或类模板的成员类模板

     

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

     

可以由template<>;

引入的声明声明

除非明确允许,否则不能部分专门化任何内容,并且不明确允许类模板的成员函数。只有部分模板可以部分专用(如14.5.5中所述)。

(请注意,显式专用类模板的成员类模板本身就是一个类模板。)