1

鉴于我关于迭代器和反向迭代器的最后一个问题,我现在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我正在处理的 s。

谢谢!!

4

1 回答 1

2

您的专业化iterator不正确,颠倒了值类型和迭代器类别。它应该是:

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

结果,虽然const_iterator直接使用它时工作正常,但任何依赖于它的特性的东西,例如 using <algorithm>, or std::reverse_iterator,都会失败。

于 2013-02-27T17:13:56.037 回答