成员函数的显式模板特化

时间:2014-09-07 11:22:43

标签: c++ templates

我有以下最小例子:

class A
{
  template<typename X, typename Y>
  void f()
  { }

  template<>
  void f<int, char>()
  { }
};

编译器提供错误消息

 explicit specialzation in non-namespace scope.

为什么这是错的,我该如何解决?

2 个答案:

答案 0 :(得分:1)

§14.7.3[temp.expl.spec] / p2:

  

应在包含专用模板的命名空间中声明显式特化。

所以你需要在A的定义之外移动专门化:

class A
{
  template<typename X, typename Y>
  void f()
  { }
};

template<>
void A::f<int, char>()
{ }

答案 1 :(得分:0)

来自C ++标准:

  

应在其名称空间中声明显式特化   模板是成员,或者,对于成员模板,在命名空间中   其中封闭类或封闭类模板是其成员。   成员函数,成员类或的明确特化   类模板的静态数据成员应在声明中声明   类模板所属的名称空间。

因此,您需要将专业化移到A定义的范围之外。你可以试试这个:

class A
{
  template<typename X, typename Y>
  void f()
  { }
};
template<>
void A::f<int, char>()
{ }