【问题标题】:Problem with Boost bidirectionnal iterator not writableBoost双向迭代器不可写的问题
【发布时间】:2011-09-26 20:14:06
【问题描述】:

我尝试使用 Boost Iterator 制作双向迭代器。我已经按照文档here 中的建议实现了一些功能。

我有一个父类,其中要实现的函数被声明为纯虚拟(我需要多态迭代器)。目前,我有一个实现功能的继承类。此外,我使用 boost::bidirectional_traversal_tag。

dereference()函数在继承类中实现如下:

template <typename T>
T& ImageIterator_NotPlanar<T>::dereference() const {
  return *((T*)buffer);
}

读取值如下例所示,效果很好:

for (; !iter.isEndReached(); ++iter)
  cout << "ITERATOR INC: " << *iter << endl;

(其中 isEndReached() 是个人功能)。问题是下面的代码不起作用:

*iter = 3;

g++ 返回以下错误:

lvalue required as left operand of assignment

怎么了?

谢谢

【问题讨论】:

  • 该错误可能意味着您在从iterator_facade 派生时传递了不正确的ValueReference 模板。很遗憾您没有发布完整的迭代器定义,因为错误可能很明显。

标签: c++ boost iterator boost-iterators


【解决方案1】:

我们需要准确地查看错误是在哪里产生的。另外,我们必须假设你有正确的非常量版本

你需要有吗

template <typename T>
T& ImageIterator_NotPlanar<T>::dereference() {
  return *((T*)buffer);
}

template <typename T>
T const& ImageIterator_NotPlanar<T>::dereference() const {
  return *((T*)buffer);
}

【讨论】:

  • 谢谢,我尝试在 dereference() 作为您的第一个提议后删除 const,但出现错误“没有匹配函数调用... dereference() const”。我不明白如何使用 Boost Iterator 制作可写的迭代器,老实说,我认为文档在这个主题上是难以理解的。对于错误,它来自*iter = 3 所在的行,我没有来自编译器的更多信息。谢谢
  • 您是否创建了 both 重载,如图所示?此外,您应该能够提供最小的工作示例和编译器消息 WITH 行号。编译器报告行号。
  • 是的,我创建了重载,但我认为它们不是重载,因为 boost 不会调用此类函数。对于编译器,我唯一的错误是/home/benlaug/projets/tfe/tfe_seg_perfs/test/main_test.cc:79:11: error: lvalue required as left operand of assignment 而main_test.cc:79 是*iter = 3;。我真的不明白如何制作可写迭代器。
  • 在同一范围内具有相同名称的两个函数是定义重载。我了解您的意思是说他们没有被调用(很可能提升会希望您专门制定取消引用“策略”以避免虚拟成本)。只需发布一个工作示例,我们将在几秒钟内发现问题。我承诺。这里有大量关于 SO 的 c++ 知识。由于问题不明确,这不起作用
  • 问题是代码有点长。作为pastebin的网站链接是否可以?我在 iterator_facade 文档中发现了一个新元素。在 iterator_facade 操作部分,有reference operator*() const;。显然,没有办法制作可写的双向迭代器。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 2011-04-08
  • 2016-06-15
相关资源
最近更新 更多