Хорошо, подожди, причина сложная, но не бойся, решение простое. Читайте дальше.
array
- это шаблон, поэтому члены класса array<T, N>
не известны до создания экземпляра шаблона (помните, что шаблон может быть специализированным). И поскольку begin
, по-видимому, не зависит от каких-либо параметров шаблона, его имя разрешается на первом этапе поиска, до создания экземпляра array<T, N>
, т.е. до того, как станут известны члены array<T, N>
. Вот почему вы получаете begin
не найдена или похожая ошибка.
Простым решением является использование this->begin
. Таким образом, begin
будет разрешен при поиске второй фазы (после создания экземпляра std::array<T, N>
), поскольку теперь ясно, что begin
может быть членом унаследованного класса шаблона.
Кроме того, plus
должно быть plus<>{}
или plus{}
в C ++ 17.
И рекомендация: старайтесь избегать using namespace std
Почему "использование пространства имен std" считается плохой практикой?
Двухфазный поиск - требуется пояснение