我编写了一个Array结构(是的,我知道它们已经存在于其他地方,但我想创建自己的结构)。为什么我的代码要求我添加的项具有无参数构造函数?
template <typename T>
struct Array {
private:
unsigned int Capacity;
unsigned int Count;
public:
T *Items;
// ***********/
Array()
{
Count = 0;
Capacity = 0;
Items = 0;
}
void resize(const unsigned int capacity)
{
Capacity = capacity;
T *x = new T[Capacity]; //*** Error: invalid new-expression on class type SomeStruct ***//
for (unsigned int i = 0; i < Count; i++)
x[i] = Items[i];
delete[] Items;
Items = x;
}
void addItem(const T &item)
{
if(Count == Capacity)
resize();
Items[Count] = item;
Count++;
}
~Array() {
delete[] Items;
}
};
如果我创建这样的数组......
Array<SomeStruct> MyStructs;
...并像这样调用resize()......
MyStructs.resize(10);
...它在显示的行上失败。
我以为我在数组上调用new,那为什么要调用无参数构造函数呢?
答案 0 :(得分:2)
指令T *x = new T[Capacity];
创建类型为T的Capacity
个新对象。在此处调用T的默认构造函数。这就是为什么你的T类需要一个默认的(“paratemterless”)构造函数。
编辑:
指令Items[Count] = item;
需要赋值运算符或复制构造函数。如果两者都不可用,我想编译器可能会执行成员克隆。