Почему при использовании std :: reverse_iterator используется другой тип возврата по умолчанию? - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь реализовать итератор и обратный итератор для контейнера, однако тип возвращаемых данных этих двух итераторов различен.

Соответствующий код, относящийся к итераторам:

template <typename T, size_t N>
ActivePtr<T> ObjectPool<T, N>::ObjectPoolIterator::operator*()
{
    return curr->data[index].MakePtr();
}

template <typename T, size_t N>
typename ObjectPool<T, N>::ObjectPoolIterator ObjectPool<T, N>::begin() const
{
    return ObjectPoolIterator(head, nullptr, 0);
}

template <typename T, size_t N>
typename ObjectPool<T, N>::ObjectPoolIterator ObjectPool<T, N>::end() const
{
    return ObjectPoolIterator(nullptr, tail, 0);
}

template <typename T, size_t N>
std::reverse_iterator<typename ObjectPool<T, N>::ObjectPoolIterator> ObjectPool<T, N>::rbegin() const
{
    return std::make_reverse_iterator(end());
}

template <typename T, size_t N>
std::reverse_iterator<typename ObjectPool<T, N>::ObjectPoolIterator> ObjectPool<T, N>::rend() const
{
    return std::make_reverse_iterator(begin());
}

Соответствующий код, относящийся к регистру использования:

    for (ObjectPool<long long, 100000>::ObjectPoolIterator i = objectPool.begin(); i != objectPool.end(); ++i)
    {
        objectPool.Erase(*i); // works fine
    }

    for (std::reverse_iterator<ObjectPool<long long, 100000>::ObjectPoolIterator> i = objectPool.rbegin(); i != objectPool.rend(); ++i)
    {
        objectPool.Erase(*i); // error: unable to convert from long long to ActivePtr<long long>
    }

Sidenote: Unary * на ActivePtr действительно возвращает T &.Возможно, это могло повлиять на суждение std :: reverse_iterator по определению типа возвращаемого значения?

Есть ли обходной путь для этого помимо определения моего собственного обратного итератора?Я хотел бы, чтобы обратный итератор все еще возвращал мне ActivePtr, как и оригинальный итератор.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...