列表迭代器,"lvalue required as left operand of assignment"
List Iterator, "lvalue required as left operand of assignment"
我正在为类赋值处理一个循环的双链表,但我遇到了一些问题。当我尝试将迭代器放入我自己的prefix_sum
方法或STL版本(partial_sum
)中时,它在*result = val;
和*++result = val;
行(以及partial_sum
的等效行)上给出了一个错误,指出lvalue is required as left operand of assignment
。STL版本的迭代器在我的prefix_sum
方法中运行良好,所以我知道迭代器中的某个地方有问题,但我无法放置它。
如有任何帮助,我们将不胜感激。
我的头文件:
#ifndef LIST_H
#define LIST_H
#include <string>
#include <iostream>
template<class T>
struct Node
{
Node* prev;
Node* next;
T val;
Node():prev(this), next(this) {}
Node(T aValue) :prev (this), next(this), val(aValue) {}
};
template<class T>
class s_list
{
public:
struct iterator
{
typedef std::bidirectional_iterator_tag iterator_category;
typedef std::ptrdiff_t difference_type;
typedef T value_type;
typedef T * pointer;
typedef T &reference;
public:
// Constructors:
iterator() :cur(new Node<T>()) {}
// Operatoral Overloads
T operator *() {return cur->val;}
bool operator == (const iterator an_iter) {return (cur == an_iter.cur);}
bool operator != (const iterator an_iter) {return (cur != an_iter.cur);}
iterator& operator ++ () {cur = cur->next; return *this;}
iterator& operator -- () {cur = cur->prev; return *this;}
iterator operator ++ (int)
{
iterator temp = *this;
cur = cur->next;
return temp;
}
iterator operator -- (int)
{
iterator temp = *this;
cur = cur->prev;
return temp;
}
friend class s_list;
private:
iterator(Node<T>* to_iter):cur(to_iter) {}
Node<T>* cur;
};
// Constructors:
s_list() : head(new Node<T>()){}
s_list(const s_list<T>& aList) : head(new Node<T>()) {...}
// Destructor:
virtual ~s_list() {clear(); delete head;}
// Iterator Methods:
iterator begin() {return (iterator(head->next));}
iterator end() {return (iterator(head));}
void push_back(T aVal) {...}
void push_front(T aVal) {...}
void insert(iterator pos, T aVal) {...}
int size() {...}
bool empty() {return (head->next == head->prev);}
inline void erase(iterator to_del);
inline void erase(iterator from, iterator to);
void clear(){erase(head->next, head);}
//inline void prefix_sum(iterator start_sum, iterator end_sum, iterator write_to);
// Operational Overloads:
inline void operator = (const s_list<T>& aList);
private:
Node<T>* head;
};
template <class iterator_in, class iterator_out>
iterator_out prefix_sum (iterator_in first, iterator_in last, iterator_out result)
{
std::cerr << "n*result = " << *result << 'n';
if (first != last) {
typename std::iterator_traits<iterator_in>::value_type val = *first;
*result = val;
while (++first != last) {
val = val + *first;
*++result = val;
}
++result;
}
return result;
}
#endif // LIST_H
我的(删节的)实现文件:
/**
* @date 24 November, 2013
* @brief Linked List 6
* @file HW7.cpp
*
* @note
* This work is licensed under a Creative Commons Attribution-NonCommercial 3.0
* Unported License.
*
* Permission is granted to copy, distribute, transmit, and/or adapt this software
* for any and all noncommercial purposes.
*
* For details, see:
* https://creativecommons.org/licenses/by-nc/3.0/
*/
#include "s_list.h"
#include <iostream>
#include <sstream>
#include <list>
#include <numeric>
for(int i = 1; i < 10; i++)
{
stlList.push_back(i);
myList.push_back(i);
}
std::cout << "nOriginal myList:n";
typename s_list<int>::iterator myIter = myList.begin();
while (myIter != myList.end()){
std::cout << *myIter << " ";
++myIter;
}
std::cout << "nOriginal stlList:n";
std::_List_iterator<int> stlIter = stlList.begin();
while (stlIter != stlList.end()){
std::cout << *stlIter << " ";
++stlIter;
}
std::partial_sum(myList.begin(), myList.end(), (myList.begin()));
prefix_sum(myList.begin(), myList.end(), myList.begin());
prefix_sum(stlList.begin(), stlList.end(), stlList.begin());
std::cout << "nResult after running myList with STL partial_sum() algorithmn";
myIter = myList.begin();
while(myIter != myList.end()){
std::cout << *myIter << " ";
++myIter;
}
std::cout << "nResult after running STL list with my prefix_sum() algorithmn";
stlIter = stlList.begin();
while (stlIter != stlList.end()){
std::cout << *stlIter<< " ";
++stlIter;
}
}
这不起作用的原因是您没有正确重载运算符:运算符*
应该返回对T
的引用,如下所示:
T& operator *() { return cur->val; }
^
|
+-- Return type needs to be a reference type.
请注意,由于您正在定义自己的迭代器,因此还应该为中缀运算符->
提供重载。您还应该提供一对const
重载,因此最终您应该拥有以下四个操作符:
T& operator*();
const T& operator*() const;
T* operator->();
const T* operator->() const;
相关文章:
- 错误:"Left of getValue must have class/struct/union"
- 编译错误:"lvalue required as left operand of assignment" 不确定原因
- 如何在 GCC 中启用 C/C++ "Conditional with Omitted Operand"(又名猫王操作员 "?:" )
- 输出 [left]=input[i] 行中的 c++ 代码中存在无效的类型错误
- 是否可以覆盖 "find" 和 "erase" boost::bimaps::bimap.left 的方法?怎么办?
- C++指针算术"lvalue required as left operand of assignment"错误
- 为什么"operand = (operand*10) + (expression[i] - '0');"
- 重载运算符 [] 并且没有收到"lvalue required as left operand of assignment"错误
- 为什么这句话"The expression can be used only as the left-hand operand of a member function call"在 [expr.re
- 将链接哈希表初始化为 NULL。获取"lvalue required as left operand of assignment"错误。为什么?这是我的代码:
- 列表迭代器,"lvalue required as left operand of assignment"
- 编写 if 语句时出错"'=' : left operand must be l-value"
- "lvalue required as left operand of assignment"在奇怪的地方--C++
- "error: '=' : left operand must be l-value" ?(在三元中使用赋值时:)
- 编写链表时"lvalue required as left operand of assignment"错误
- 位域"In-class initialization"结果为"error: lvalue required as left operand of assignment"
- 错误:"lvalue required as left operand of assignment"
- C++错误"lvalue required as left operand of assignment"
- 如何调试提升元组错误"no operator found which takes a left-hand operand of type"
- 变换算法提供"binary '=' no operator which takes left-hand operand.."