У меня есть три файла заголовка (.hpp), которые определяют узел, отдельно связанный список и итератор. Это должно вместе создать мой единственный связанный список. Вот узел.Реализация связанного списка в C++
#ifndef NODE_HPP
#define NODE_HPP
#include <iostream>
#include <string>
template <typename T> struct node {
public:
explicit node(const T& value, node* next = 0): value_(value), next_(next){}
private:
T value_;
node* next_;
};
#endif //NODE_HPP
Вот мой SLIST
#ifndef SLIST_HPP
#define SLIST_HPP
#include "node.hpp"
#include "iterator.hpp"
template <typename T> class slist{
public:
class iterator;
slist() :head_(0){ }
bool empty() const{return (head_==0);}
int size() const{
int s=0;
iterator last=end();
for(iterator i= begin(); i!= last; ++i; ++s);
return s;
};
iterator begin() { return iterator(head_); }
iterator end() { return iterator(0); }
void insert(iterator p, const T& t);
void erase(iterator p){
node<T>* tmp = p.node_->next_;
p.node_->value = p.node_->next_.value;
p.node_->next_=p.node_->next_->next_;
delete tmp;
return p;
};
private:
node<T>* head_;
};
#endif //SLIST_HPP
И вот мой итератор класс
#ifndef ITERATOR_HPP
#define ITERATOR_HPP
#include "slist.hpp"
#include "node.hpp"
class iterator{
public:
explicit iterator(node<T>* node=0) :node_(node){ }
T& operator*(){return node_-> value_;}
T* operator->(){return node_->value_;}
iterator& operator++(){
if(node_ != 0) node_ = node_->next_;
return *this;
}
iterator operator++(int){
iterator tmp = *this;
if(node_!= 0) node_ = node_->next_;
return tmp;
}
bool operator==(const iterator& iter) const { return (node_ == iter.node_); }
bool operator!=(const iterator& iter) const { return (node_ != iter.node_); }
private:
node<T>* node_;
};
#endif //ITERATOR_HPP
Проблема нет ничего, кажется, разрешится. Код не компилируется, потому что slist не может читать значения из итератора, несмотря на то, что итератор определяется внутри slist. Даже сам класс итератора проявляет неловкость в методах, возвращающих объект итератора. Может кто-нибудь помочь мне понять, что здесь происходит не так.
Почему простой голос без комментариев (причина)? – Jumper
Вы, кажется, забыли строку 'template ...' в 'iterator.hpp'. Вы уверены, что это настоящий код? – Beta
@Jumper _ «Почему голосующий голос даже без комментария (причина)?» _ Редкие недостатки без причины: _ «Вопросы, требующие помощи по отладке (« почему этот код не работает? ») Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для его воспроизведения в самом вопросе. Вопросы без явного заявления о проблеме не полезны для других читателей. См.: ** [Как создать минимальный, завершенный и проверяемый пример] (http : //stackoverflow.com/help/mcve) **. "_ Сконцентрируйтесь на _minimal_. –