次のテンプレート クラスがあります。
template<typename T, int nSize> class Stack{
private:
int m_nCurrentPos;
Array<T> m_tArray;
public:
Stack(int nCurrentPos = 0);
...
};
デフォルトのコンストラクターは次のように機能します。
template<typename T, int nSize> Stack<T,nSize>::Stack(int nCurrent){
m_nCurrent = nCurrentPos;
m_tArray = Array<T>::Array(nSize);
};
配列は次のようになります。
template <typename T> class Array{
private:
T* m_cData;
int m_nSize;
static int s_nDefaultSize;
public:
Array();
Array(int nSize);
...
};
そして、そのコンストラクタは次のとおりです。
template<typename T> Array<T>::Array(){
m_nSize = s_nDefaultSize;
m_cData = new T[m_nSize];
}
そして、明らかに、
template<typename T> Array<T>::Array(int nSize){
m_nSize = nSize;
m_cData = new T[m_nSize];
}
そのため、スタックは配列といくつかの追加機能から構成されています。私の問題はs_nDefaultSize
、Arrayで say と定義し512
、インスタンス化しようとするとStack<int,1024>
、クラス Array から例外が発生し、異なる長さの 2 つの配列を割り当てようとしているということです。そのようにコードを変更するとすぐにs_nDefaultSize=1024
(テンプレートの非型引数と一致するようにnSize
)、すべて問題ありません。つまり、例外はすぐに発生しs_nDefaultSize != nSize
ます。したがって、私の推測では、上記のコードでは、 のデフォルト コンストラクターでStack<T,nSize>
、つまり、m_tArray = Array<T>::Array(nSize);
はm_tArray
Array のデフォルト コンストラクターによって作成され ( を採用s_nDefaultSize
)、コンパイラーはそれをArray<T>::Array(nSize)
(採用して my を採用) に割り当てようとします。nSize
価値)。あれは正しいですか?はいの場合、どうすればこの動作を変更できますか? これは私が昨日投稿した別の質問です。構成ではなく継承に関するものですが、このスレッドの質問に非常に関連しています。乾杯!