何か小さなものが足りないと思います。T =任意のパラメーターを持つテンプレートクラスである実装のために、テンプレートクラスのコンストラクターを特殊化したいと思います。語彙が少しずれていたらごめんなさい。基本的に、ギザギザの2D配列を許可する必要があるため、があり、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>
提供する必要のあるデータ型が2つあることを意味しますが、テンプレートの特殊化に必要なのは、基になる配列のデータ型だけであることは明らかです。期待がArEl<ArEl<T>>
専門的である場合、これ以上かかることはありません。
template<typename T>
class ArEl<ArEl<T>> {
/*Blah Blah Blah*/
};
継承の必要はなく、2番目のデータ型も必要ありません。
ただし、追加します。そもそも、この専門分野の必要性は実際にはありません。スペシャライゼーションをまったく記述しない場合でも、次のコードはそのまま機能するはずです。
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>
ちなみに、ビルディングブロックとして使用して構築できます) 、特にあなたが専門分野を書くことにコミットしているとは思わないのでArEl<ArEl<ArEl<int>>>
(そしてそうです、あなたがそれをしようとしている方法では、各レベルは独自の専門分野を必要とします)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加