在b树的自定义迭代器中使用操作符*出错

C++ Error with the operator* in a custom iterator for a b-tree

本文关键字:操作符 出错 迭代器 自定义      更新时间:2023-10-16

当尝试在自定义迭代器中使用操作符*()返回值时,我得到以下错误:

 error: invalid initialization of non-const reference of type 'char&' from a temporary of type 'char'

如果有人能帮助我,那就太好了!

具体代码如下:

测试代码:

  for(btree<char>::iterator itr = tree.begin(); itr != tree.end(); ++itr) {
    cout << *itr << " "; // <- this line complains about the * operator.
  }

操作符*()代码:

template <typename T> typename btree_iterator<T>::reference btree_iterator<T>::operator*() const {
  return pointee_->value(); // <- this line is where the error above is produced from.
}
btree_iterator类中的

pointee_是一个私有变量,定义如下:

btree_node<T>* pointee_;

引用在btree_iterator类中按如下方式类型化:

  typedef T&       reference;

value()在btree_node类中定义如下:

T value() const;
// function definition.
template <typename T> T btree_node<T>::value() const { return value_; }

值最初通过它的构造函数存储到btree_node中,如下所示:

template <typename T> btree_node<T>::btree_node(const T& elem) : value_(elem), nextCont_(NULL), prevCont_(NULL), nextNode_(NULL), prevNode_(NULL) {}

请让我知道,如果我错过了包括任何重要信息,并道歉,如果我做了!

基于错误,听起来像是我试图返回对局部变量的引用。迭代器本身可以是本地的,但它返回的值不应该是本地的,因为节点构造函数最初接受一个引用,并将其存储在节点中。

提前感谢,并致以问候!

您试图使用对临时变量的引用

template <typename T> T btree_node<T>::value() const { return value_; }
                     ^^^

返回value_的临时副本。

template <typename T> typename btree_iterator<T>::reference btree_iterator<T>::operator*() const {
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  return pointee_->value(); // <- this line is where the error above is produced from.
}

返回对该临时副本的引用。您很可能希望value()返回一个引用,但这取决于您—引用允许您的btree的客户端更改内容。特别是如果树是根据节点的值排序的,您可能不希望允许这样做。想想这和你的设计有什么关系。

pointee_->value()返回的值基本上是一个新的副本。因此,这个值在operator*中是局部的,你不能返回对它的引用。

我建议像大多数容器那样做,即同时拥有iteratorconst_iterator,而const_iterator返回const引用,iterator返回引用。同样的原则也适用于value()。具有返回ref和const ref的版本。

如果您想要处理副本,您可以从客户端代码中的引用创建它们。如果您不希望允许更改值,只需删除(或将其设为private,或其他)非const部分。它认为它也符合人们使用你的树的期望:

迭代器不会在某个地方复制数据,而是对数据结构中的数据进行迭代。如果你想要副本,你可以制作。