ошибка C2229: класс «VectorRemake <T>» имеет недопустимый массив нулевого размера - PullRequest
0 голосов
/ 21 ноября 2010
template <class T>
class VectorRemake
{
private:
    T* list[];
    int count;
    int capacity;

public:
    VectorRemake() :capacity(DEFAULT_CAPACITY) :count(0) {list = new T[capacity];}
    VectorRemake(int capacity) :capacity(capacity) :count(0) {list = new T[capacity];}
~VectorRemake() {delete [] list;}

    ...
}

Я не уверен, что я делаю здесь не так.Проблемы вызывают конструкторы.

void resize(int size, T t=T())
    {
        if (size < capacity)
        {
            for (int i = size; i < capacity; i++)
                T[i] = 0;
            count = size;
        }
        else if(size > capacity)
        {
            T *newlist = new T[size];

            for (int i = 0; i < count; i++) newlist[i] = list[i];
            for (int i = count; i < size; i++) newlist[i] = t;

            delete [] list;
            list = newlist;
        }
        else return;
        capacity = size;
    }

Я получаю 4 ошибки @T [i] = 0;(6-я строка).

Я пытаюсь установить его в NULL, но мой инструктор сказал мне, что NULL не является стандартом c ++, что мне делать?C4091: '': игнорируется слева от 'double', когда переменная не объявлена ​​3 \ solution11-3 \ solution11-3.cpp 46 Ошибка 2 ошибка C2143: синтаксическая ошибка: отсутствует ';'до '['
Ошибка 3, ошибка C2337: 'i': атрибут не найден
Ошибка 4, ошибка C2143: синтаксическая ошибка: отсутствует ';'до '='

Ответы [ 3 ]

3 голосов
/ 21 ноября 2010

T* list[]; - массив указателей (массив массивов при динамическом размещении). И вы не можете использовать открытые массивы в качестве атрибутов.

Вы, скорее всего, хотели T* list;

2 голосов
/ 21 ноября 2010

Это не конструктор.Это T* list[], который определяет член list как массив указателей на T без указания размера массива.
Возможно, вы вместо этого захотите T* list;.

Также обратите внимание, что в соответствии с правилом трех вашему классу, имеющему деструктора, также потребуется конструктор копирования и оператор присваивания .
Реализация оператора присваивания поверх деструктора и конструктора копирования с использованием Копирование и замена идиома .

Тогда синтаксис для вашего списка инициализации неправильный.Это

VectorRemake() : capacity(DEFAULT_CAPACITY), count(0) {list = new T[capacity];}
//                                         ^
//                                         comma, not colon

Наконец, в C ++ определение класса должно сопровождаться точкой с запятой , в противном случае вы получите странные ошибки в коде после определения вашего класса.
Причина этого в том, что определение класса может быть частью определения переменной:

class foo { ... } bar;

(Это определяет bar как переменную типа foo. Фактически, этодаже возможно использовать класс, который не имеет имени:

class { ... } foobar;

, хотя это редко делается.)

Компилятору нужна точка с запятой, чтобы узнать,

class x {}

y yaddayadda ...

- это определение y как экземпляра x или начало того, что yaddayadda может быть.

1 голос
/ 21 ноября 2010

Объявление list должно быть T* list;.В вашей текущей декларации говорится, что вам нужен массив без указателей на T.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...