假设我有一个具有很多功能的模板类,并且我想专门针对它们进行更改,以仅更改其中一些功能,并使其他功能完全与基本模板类中指定的功能相同。

我怎样才能做到这一点?

以下是我想要实现的目标,但是解决方案不好,因为它不允许我将int的特化称为Base<int> –我需要为此使用IntSpec

#include <iostream>

using namespace std;

template<typename T>
struct Base
{
  void print1() {cout << "Base::print1" << endl;};
  void print2() {cout << "Base::print2" << endl;};
};

struct IntSpec : public Base<int>
{
  void print2() {cout << "Base<int>::print2()" << endl;};
};

int main()
{
  Base<double> d;
  // Base<int> i;  <-- I want this kind of instantiation
  IntSpec i;

  d.print1();
  d.print2();
  i.print1();
  i.print2();
}

输出为:
Base::print1
Base::print2
Base::print1
Base<int>::print2()

最佳答案

Nicol的解决方案工作正常,但这是一种替代方法:

template<typename T>
struct Base
{
  void print1() {cout << "Base::print1" << endl;};
  void print2() {cout << "Base::print2" << endl;};
};

template<>
void Base<int>::print2() {cout << "Base<int>::print2()" << endl;};

这样,您可以只专门化特定的成员函数,并且仍然可以使用那些尚未专门化的成员函数(在本例中为print1)没有任何问题。因此,现在您可以按需要使用它:
Base<int> i;
i.print1();
i.print2(); // calls your specialization

演示here

关于c++ - 模板专门化和继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17056579/

10-11 00:47