如何只对模板类的某些成员进行专门化?

时间:2011-02-10 10:01:27

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

代码:

template<class T>
struct A {
  void f1() {};
  void f2() {};

};

template<>
struct A<int> {
  void f2() {};
};


int main() {
  A<int> data;
  data.f1();
  data.f2();
};

ERROR:

test.cpp: In function 'int main()':
test.cpp:16: error: 'struct A<int>' has no member named 'f1'

基本上,我只想专门化一个函数并使用其他函数的通用定义。 (在实际代码中,我有许多我不想专门研究的函数。)

怎么做?谢谢!

3 个答案:

答案 0 :(得分:10)

考虑将公共部分移动到基类:

template <typename T>
struct ABase
{
    void f1();
};


template <typename T>
struct A : ABase<T>
{
    void f2();
}  


template <>
struct A<int> : ABase<int>
{
    void f2();
};

您甚至可以在派生类中覆盖f1。如果您想要做一些更有趣的事情(包括能够从基类中的f2代码中调用f1),请查看CRTP

答案 1 :(得分:8)

这会有所帮助:

template<typename T>
struct A
{
  void f1()
  {
    // generic implementation of f1
  }
  void f2()
  {
    // generic implementation of f2
  }
};

template<>
void A<int>::f2()                                                               
{
  // specific  implementation of f2
}

答案 2 :(得分:2)

当我们声明模板类的特化时,我们还必须定义它的所有成员,甚至是那些与通用模板类完全相同的成员,因为从通用模板到成员的成员没有继承专业化。因此,在您的专业化中,您还必须实施void f1();