Итератор списка, «lvalue требуется в качестве левого операнда присваивания»

Я работаю над циклическим, двусвязным списком для задания класса, и у меня возникли некоторые проблемы с ним. Когда я пытаюсь поместить свой итератор в мой собственный 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() algorithm\n";

myIter = myList.begin();
while(myIter != myList.end()){
std::cout << *myIter << "  ";
++myIter;
}std::cout << "\nResult after running STL list with my prefix_sum() algorithm\n";

stlIter = stlList.begin();
while (stlIter != stlList.end()){
std::cout << *stlIter<< "  ";
++stlIter;
}
}

-4

Решение

Причина, по которой это не работает, заключается в том, что вы неправильно перегрузили оператор: operator * должен вернуть ссылку на 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;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]