【发布时间】:2013-03-05 06:50:16
【问题描述】:
我有以下模板类:
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];
}
所以,Stack 是由 Array 和一些额外的功能组成的。 我的问题是,当我在 Array 中定义 s_nDefaultSize 为 512,并尝试实例化 Stack<int,1024> 时,我从类 Array 中得到一个异常,说我正在尝试分配两个不同长度的数组。一旦我将代码更改为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)(使用我的nSize 值)。那是对的吗?如果是,我该如何改变这种行为? This is another question that I posted yesterday, which, even though is about inheritance, not composition, is very much related to the question in this thread. 干杯!
【问题讨论】:
-
不是 100% 的重复,但这正是您所需要的。
标签: c++ templates constructor default-constructor