给定我的自定义const_iterator实现自定义const_reverse_iterator

时间:2013-02-27 14:34:06

标签: c++ iterator

在迭代器和反向迭代器上给出last question,我现在为我的自定义类实现了const_iterator实现...我想现在创建一个const_reverse_iterator迭代迭代容器

我实现了我的const_iterator

class const_iterator : public std::iterator<T, std::bidirectional_iterator_tag>
{
    ...
    // operator overloads *, ++, --, ==, !=, e.g.
    uint32_t operator*() const;
    ...
};

我有typedef

typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

现在,我的crbegin()crend()实现看起来像这样(我认为不正确的位):

const_reverse_iterator crbegin() const
{
    return const_reverse_iterator(this->cend());
}

const_reverse_iterator crend() const
{
    return const_reverse_iterator(this->cbegin());
}

问题: 在我的测试中,以下工作正常:

for(const_iterator i = line.cbegin(); i != line.cend(); ++i)
{
    std::cout << static_cast<char>(*i); // Display as a 'char' for testing purposes
}

但是使用以下代码:

for(const_reverse_iterator i = line.crbegin(); i != line.crend(); ++i)
{
    std::cout << static_cast<char>(*i); // Why won't you display as a 'char' from 'unint32_t' like 'const_iterator' does??
}

我在std::cout行上收到以下错误:

error: invalid static_cast from type 'std::bidirectional_iterator_tag' to type 'char'|

这是创建无忧reverse_iterators的有效方法吗?

我觉得我有一些简单的东西,但是我搜索得很远,我找不到一个示例,它展示了如何在std::reverse_iterator<ITERATOR_TYPE>模板化的类上调用构造函数。

提前感谢您的客气话和建议。

编辑:

仅供参考,以下解决方案,我不得不改变:

class const_iterator : public std::iterator<T, std::bidirectional_iterator_tag>

class const_iterator : public std::iterator<std::bidirectional_iterator_tag, const T>

让它发挥作用。另请注意const,因为我正在处理const_iterator

谢谢!

1 个答案:

答案 0 :(得分:2)

您错误地专门设置了iterator,反转了值类型和迭代器类别。它应该是:

class const_iterator : public std::iterator<std::bidirectional_iterator_tag, T>
                                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

因此,尽管const_iterator在直接使用时工作正常,但任何依赖于其特征的东西,例如使用<algorithm>std::reverse_iterator会失败。