Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2017, 22:40   #1
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию Реализация итераторов для своего контейнера

Я пишу класс динамического массива я хочу реализовать свои итераторы вместо использования сырых указателей. Сейчас у меня написан такой код:

Итератор:
Код:
template <typename TData> class CArray;

template <typename TData>
class CArrayIterator
{
	template <typename T>
    friend class CArray;

private:
	CArrayIterator(
        TData * _p
    );
public:
	CArrayIterator(
		const CArrayIterator & _it
	);

	bool operator==(
		CArrayIterator const & _other
    ) const;

	bool operator!=(
		CArrayIterator const & _other
    ) const;

	TData & operator*() const;
	TData & operator->() const;

	CArrayIterator & operator++();
	CArrayIterator & operator++(int);

private:
	TData * p;
};
Объявление класса CArray:
Код:
template <typename TData>
class CArray
{
public:
    typedef TData value_type;
    typedef size_t size_type;
    typedef CArrayIterator<TData> iterator;
    typedef CArrayIterator<const TData> const_iterator;

    ...

	// Iterator to the beginning
    iterator begin();

    // Const iterator to the beginning
    const_iterator begin() const;

    // Iterator to the end
    iterator end();

    // Const iterator to the end
    const_iterator end() const;
Функции begin() и end() при возвращении итератора используют его конструктор преобразования и неявно создают итератор из указателя:
Код:
template <typename TData>
typename CArray<TData>::iterator CArray<TData>::begin()
{
    return elements;
}

template <typename TData>
typename CArray<TData>::const_iterator CArray<TData>::begin() const
{
    return elements;
}
В функции очистки массива используются итераторы:
Код:
template <typename TData>
void CArray<TData>::clear()
{
    for (auto it = begin(); it != end(); ++it)
        it->TData::~TData();
    first_free = elements;
}
И в ней произошла ошибка при вызове оператора ->, которую я сейчас не могу воспроизвести.

Эти итераторы используются в библиотечной функции std::sort, и как я понимаю, ошибочно, потому что собственную имплементацию итератора надо наследовать от стандартного класса итератора.

Проблема в том, что при компиляции я получаю кучу ошибок:

>error C2839: invalid return type 'int' for overloaded 'operator ->'
>note: while compiling class template member function 'void CArray<int>::clear(void)'
>note: see reference to function template instantiation 'void CArray<int>::clear(void)' being compiled
>note: while compiling class template member function 'void CArray<int>:ush_back(const TData &)'

>error C2039: 'TData': is not a member of 'CArrayIterator<TData>'
>error C2065: 'TData': undeclared identifier
>error C2061: syntax error: identifier 'TData'
>error C2039: 'first_free': is not a member of 'CArrayIterator<TData>'
>error C2182: 'check_and_realloc': illegal use of type 'void'


Что я делаю не так?
Aoizora вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как добавить лайки для соц. сетей для своего сайта IT-Lopata HTML и CSS 2 09.04.2014 23:33
в отдельном модуле описать типы данных и подпрограммы для реализации контейнера(списка) Delphi Star1x Помощь студентам 2 16.01.2014 23:42
Реализация контейнера map. fabregas Общие вопросы C/C++ 11 19.04.2013 16:23
Реализация контейнера на базе очереди. Delphi medvedeva Помощь студентам 0 26.06.2011 13:36
Не воспринимается класс итераторов Paganec Общие вопросы C/C++ 1 21.12.2010 15:34