在b树的自定义迭代器中使用操作符*出错
C++ Error with the operator* in a custom iterator for a b-tree
当尝试在自定义迭代器中使用操作符*()返回值时,我得到以下错误:
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*
中是局部的,你不能返回对它的引用。
我建议像大多数容器那样做,即同时拥有iterator
和const_iterator
,而const_iterator返回const引用,iterator返回引用。同样的原则也适用于value()
。具有返回ref和const ref的版本。
如果您想要处理副本,您可以从客户端代码中的引用创建它们。如果您不希望允许更改值,只需删除(或将其设为private,或其他)非const部分。它认为它也符合人们使用你的树的期望:
迭代器不会在某个地方复制数据,而是对数据结构中的数据进行迭代。如果你想要副本,你可以制作。
- 访问者访问变体并返回不同类型时出错
- 在Linux for Windows上编译C++代码时出错
- 读取文件的最后一行并输入到链接列表时出错
- 重载操作程序时出错>>用于类中的字符串 memebr
- 调用专用模板时出错"no matching function for call to [...]"
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 在Google Kick start中提交时出错
- 在c++中访问int到类对象的映射时出错
- 分段错误当我试图运行程序时出错
- 使用dynamic_cast和构造函数时出错
- CHECK(调用)函数在Google Colab中出错
- 用pybind11包装C++抽象类时出错
- 当有额外的括号时,在临时对象上调用用户定义的操作符+出错
- 用new操作符定义std::shared_ptr时出错
- 在b树的自定义迭代器中使用操作符*出错
- 使用jsoncpp库使用/操作符创建JSON字符串时出错
- 定义模板化操作符重载时出错
- 重载操作符*出错
- 重载操作符时出错