Если вы напишите это без псевдонимов типов, вы получите определения, такие как
Element begin(){
return **data;
}
, и используйте как
UniqueArray<Vehicle>::ua_iterator it = something.begin();
it++;
, становится
Vehicle it = something.begin();
it++;
, что делает причина ошибок более очевидна - вы пытаетесь применить операции итератора к вашему типу элемента.
Если вы хорошо справляетесь с итерацией, производящей Element*
, простое решение -
typedef Element** ua_iterator;
ua_iterator begin(){
return data;
}
ua_iterator end(){
return data + curr_size;
}
и аналогичные для константных версий.
Тогда вы могли бы написать
UniqueArray<Vehicle>::ua_iterator it = something.begin();
Vehicle* v = *it;
Если вы хотите, чтобы итерация производила Element&
, вам нужно написать класс итератора с соответствующими перегрузками и признаками .
Это не очень сложно, но становится утомительным.