Причина, по которой вы получаете ошибки компилятора, заключается в следующей строке:
T this_array[start_size];
Эта строка заставит ваши Tarray
фактически содержать start_size
экземпляров T
. Он не будет содержать указатель или ссылку на эти экземпляры - они будут частью того же блока памяти, который содержит другие переменные экземпляра Tarray.
Это сделало бы размер класса зависимым от start_size, а start_size не известен во время компиляции. Размер любого класса C ++ должен быть известен во время компиляции, это невозможно.
Есть два способа решить эту проблему:
- Выделите массив
T
экземпляров в куче, используя массив new. Это то, что делает std::vector
. Написать такой класс и заставить его вести себя правильно, когда он копируется / перемещается / расширяется / и т. Д., Сложно и утомительно, поэтому я рекомендую использовать вместо него std::vector
.
- Установить фиксированное количество экземпляров T и передать его в качестве параметра шаблона
т.е:.
template<typename T, std::size_t N>
class TArray
{
...
T this_array[N];
...
}
Это то, что делают std :: array (только C ++ 11) и boost :: array. Опять же, я бы рекомендовал использовать один из них вместо того, чтобы писать свой. Если, конечно, это не домашнее задание ...
Наконец, стоит отметить, что это ошибка:
~Tarray(){
delete[] this_array;
}
this_array
не был выделен с new
, поэтому вы не должны delete
его. Если массив является частью класса в том виде, как он есть здесь (вместо того, чтобы выделяться в куче и принадлежать классу отдельно), то он будет уничтожен вместе с остальной частью класса по умолчанию. Вызов delete
не только не нужен, но почти наверняка вызовет сбой.