Для начала в коде есть несколько ошибок.
Например, функция size
возвращает недопустимое значение.
template <typename T>
int dynamicIntArray<T>::size(void)
{
return capacityIndex + 1;
}
Изначально массив состоит из 4 элементов
T *arrPtr = new T[4]();
int capacityIndex = 4;
, но функция возвращает 5 (capacityIndex + 1
).
В функции insert
есть доступ к памяти за пределами выделенного массива. Например, когда fillIndex равен capacityIndex - 1
, тогда в этом операторе if
if (filledIndex < capacityIndex)
{
arrPtr[++filledIndex] = n;
return true;
}
значение n
записывается в позиции, равной capacityIndex
, тогда как действительный диапазон индексов равен [0, capacityIndex)
.
В этом фрагменте кода
capacityIndex *= 2;
T *newarrPtr = new T[capacityIndex]();
// Copy old array
for (int i = 0; i < capacityIndex; i++)
{
newarrPtr[i] = arrPtr[i];
}
элемент данных capacityIndex
был увеличен
capacityIndex *= 2;
Однако вы используете это новое значение в для для l oop
for (int i = 0; i < capacityIndex; i++)
{
newarrPtr[i] = arrPtr[i];
}
для копирования несуществующих элементов массива, на который указывает arrPtr
.
Что касается ошибки компилятора, то в таких операторах, как этот
myarray.insert("A");
Вы используете строковые литералы. Например, строковый литерал "A"
имеет тип const char[2]
, который в выражении аргумента преобразуется в тип const char *
.
Этот указатель вы пытаетесь присвоить объекту типа char
то есть объекту выделенного динамически массива с типом элемента char
.
Вы должны написать как
myarray.insert( 'A' );
То есть вместо строкового литерала вы должны использовать символ литерал с типом char
- тип аргумента шаблона типа.