成员函数的模板专业化

时间:2014-05-02 12:38:48

标签: c++ templates

我最近在C ++中发现了template specialization

template <typename T>
void    fct(void) {}

template <>
void    fct<int>(void) {}

int main(void) {
  fct<int>();
  return 0;
}

我想对类中的成员函数使用模板专门化。

class   MyClass {
  public:
    template <typename T>
    static void fct(void) {}

    template <>
    static void   fct<int>(void) {}
};

int     main(void) {
  MyClass::fct<int>();

  return 0;
}

不幸的是,使用g++进行编译会出现以下错误:

error: explicit specialization in non-namespace scope ‘struct MyClass’
error: template-id ‘toto<int>’ in declaration of primary template

我注意到做模板专业化可以在主范围或命名空间中工作,但不能在结构或类中工作。

我在stackoverflow上发现了一些关于使用命名空间的内容,如下面的代码所示:

namespace myNameSpace {
  template <typename T>
  void fct(void) {}

  template <>
  void fct<int>(void) {}
}

class   MyClass {
  public:
    template <typename T>
    static void fct(void) {
      myNameSpace::fct<T>();
    }
};

int     main(void) {
  MyClass::fct<int>();

  return 0;
}

我做错了什么?是否可以使用成员函数进行模板专业化?如果没有,最好的办法是什么?有没有比使用命名空间更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:5)

在类定义之后编写专门化:

class MyClass
{
public:
    template <typename T>
    static void fct(void) {}
};

template <>
void MyClass::fct<int>() {}