Array结构需要无参数构造函数

时间:2014-08-17 16:12:57

标签: c++

我编写了一个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,那为什么要调用无参数构造函数呢?

1 个答案:

答案 0 :(得分:2)

指令T *x = new T[Capacity];创建类型为T的Capacity个新对象。在此处调用T的默认构造函数。这就是为什么你的T类需要一个默认的(“paratemterless”)构造函数。

编辑: 指令Items[Count] = item;需要赋值运算符或复制构造函数。如果两者都不可用,我想编译器可能会执行成员克隆。