Для решения этой проблемы по уму надо написать вот это в определении производного класса:
using Array<T>::_size;
using Array<T>::_capasity;
using Array<T>::_data;
Ответ на вопрос "почему" в С++ всегда один: "потому что
стандарт":
Non-dependent names are looked up and bound at the point of template definition. This binding holds even if at the point of template instantiation there is a better match:
Проблема в том, что Array зависит от T, а вот его член _size от T не зависит. Ну вот не ищет компилятор независимые имена в зависимых местах. Независимые имена разрешаются в месте определения шаблона, когда еще неясно даже, с каким оно типом будет работать-то. Поэтому он никак до Array достучатся не может, ведь никакого T конкретного у него еще нет.
Надо как-то компилятору указать, где искать вот эти ваши _size и т.д.
Например, через
this->
или через
using
или через
Array<T>::
.
Вообще от этих правил lookup-а в C++ волосы дыбом встают и куча приколов вылезает. Их надо только запомнить. Оно неинтуитивно, но таково оно есть.