在迭代器和反向迭代器上给出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
。
谢谢!
答案 0 :(得分:2)
您错误地专门设置了iterator
,反转了值类型和迭代器类别。它应该是:
class const_iterator : public std::iterator<std::bidirectional_iterator_tag, T>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
因此,尽管const_iterator
在直接使用时工作正常,但任何依赖于其特征的东西,例如使用<algorithm>
或std::reverse_iterator
会失败。