我想我只是遗漏了一些小东西。我想将模板化类的构造函数专门用于实现,其中 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/