c++ - 如何在部分类模板特化中实现继承?

标签 c++ class templates inheritance constructor

我想我只是遗漏了一些小东西。我想将模板化类的构造函数专门用于实现,其中 T = 具有任何参数的模板类。对不起,如果我的词汇有点不对劲。 基本上,我需要允许锯齿状的二维数组,所以我可能有一个 ArEl<ArEl<int>>我想预先初始化所有数组长度。

using namespace std;

template <typename T>
class ArEl {
 public:
  ArEl(size_t size = 0)
      : rSize(size), rArray(rSize ? new T[rSize]() : nullptr) {}
  ArEl(const ArEl& other);
  virtual ~ArEl() { delete[] rArray; }
  void swap(ArEl& first, ArEl& second);
  void redim(size_t size);

 private:
  std::size_t rSize;
  T* rArray;
};

template <typename T, typename T1>
class ArEl<ArEl<T>> : public ArEl<T1>{
  ArEl(size_t size = 0);
};

编辑:

我收到这个错误:

error: template parameters not deducible in partial specialization:
 class ArEl<ArEl<T>> : public ArEl<T1>{

最佳答案

您以错误的方式专门化了您的对象。

template<typename T, typename T1>暗示需要提供两种数据类型,但很明显,您的模板特化唯一需要的是底层数组的数据类型。如果期望是 ArEl<ArEl<T>>特化,它不应该超过这个:

template<typename T>
class ArEl<ArEl<T>> {
    /*Blah Blah Blah*/
};

不需要继承,也不需要第二种数据类型。

但是,我还要补充一点:首先,实际上并没有必要进行这种特化。如果您根本不编写特化,以下代码仍应按原样工作:

ArEl<ArEl<int>> dim2Array(50);
//I'm assuming ArEl will have a member size() function
for(size_t index = 0; index < dim2Array.size(); index++) {
    //I'm assuming ArEl will have an operator[] overload
    dim2Array[index].redim(30);
}
//dim2Array is now 50 int arrays, each of size 30.

我假设您想要的功能是像下面这样的东西,它确实需要模板特化,就像我上面发布的那样:

ArEl<ArEl<int>> dim2Array(50, 30);
//dim2Array is now 50 int arrays, each of size 30.

但如果我是你,我会离开 ArEl 的实现独自一人,而不是投资写一个Matrix<T>处理这种语法的类(或者可能是 Matrix<T, N> ,对于 N 维)(顺便说一句,你可以使用 ArEl<T> 作为构建 block 来构建),特别是因为我认为你不致力于编写ArEl<ArEl<ArEl<int>>> 的特化或更深(是的,按照您尝试的方式,每个级别都需要自己的特化)。

关于c++ - 如何在部分类模板特化中实现继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46594655/

相关文章:

c++ - 带有附加结果的 QCompleter

python - 如何让类在没有被调用的情况下不运行?

actionscript-3 - AS3 共享同一类的两个 MovieClip

c++ - 代码块问题

c++ - 在 C++ 中确定一个 unicode 字符是全角还是半角

c++ - Autodesk Maya、C++ 和 OpenGL 渲染引擎

java - 设计具有枚举依赖性的类的最佳方法

c++ - clang : Fold expression and "expression result unused" warning

c++ - 有没有办法将 void 作为参数传递?

具有类型的 C++ 多态性