[C++] template, list , iterator

Online-Skater

Erfahrenes Mitglied
Hallo Tutorianer

ich quäle mich schon seit Tagen durch oben genannte Teilbereiche und habe eine "Generic Class" also die Liste mit Iterator implementiert, nur leider kommen für mich seltsame Fehler.

C++:
#include <stdexcept>

template<class T>
class Element {
 public:
    Element *suc, *pre;
    T data;
    Element() {}
    Element(Element *s, Element *p, T d)
      : suc(s), pre(p), data(d) {}
};

template<class T>
class List {
public:
    //-----------------------------------------------------------------------------
    class Iterator {
    public:
        Iterator() : the_list(0), cur(0) {}
        bool operator== (const Iterator& i) const
                            {return cur == i.cur;}
        bool operator!= (const Iterator& i) const
                            {return cur != i.cur;}
        T& operator* ();                // Gives a ref to an actual element
        Iterator& operator++ ();        // Moves forward
        Iterator  operator++ (int);     // Moves forward
        Iterator& operator-- ();        // Moves backwards
        Iterator  operator-- (int);     // Moves backwards
    private:
        friend class List<T>;
        List<T> *the_list;
        Element<T> *cur;
        Iterator(List<T> *l, Element<T> *c)
          : the_list(l), cur(c) {}
    };
    //------------------------------------------------------------------------------
    List() : f(new Element<T>), sz(0)
            {f->suc = f->pre = f;}
    List(List&);
    List& operator= (List&);
    bool empty() const {return sz==0;}
    long int size() const {return sz;}
    T& front();                         // Gives reference to first element
    T& back();                          // last element
    Iterator begin() {return Iterator(this, f->suc);}
    Iterator end()   {return Iterator(this, f);}
    Iterator insert(Iterator, const T&);
    void insert(Iterator, int, const T&);
    void insert(Iterator, Iterator, Iterator);
    void erase(Iterator);
    void erase(Iterator, Iterator);
    void push_front(const T& d) {insert(begin(),d);}
    void push_back(const T& d) {insert(end(),d);}
    void pop_front() {erase(begin());}
    void pop_back() {erase(--end());}
    ~List() {erase(begin(), end()); delete f;}
private:
    Element<T> *f;
    long int sz;
};
D:\PROJECTS\C++\Templates\list\list.h:90: error: expected constructor, destructor, or type conversion before "List"
D:\PROJECTS\C++\Templates\list\list.h:155: error: expected constructor, destructor, or type conversion before '&' token
D:\PROJECTS\C++\Templates\list\list.h:164: error: expected constructor, destructor, or type conversion before "List"
D:\PROJECTS\C++\Templates\list\list.h:172: error: expected constructor, destructor, or type conversion before '&' token
D:\PROJECTS\C++\Templates\list\list.h:181: error: expected constructor, destructor, or type conversion before "List"
:: === Build finished: 5 errors, 0 warnings ===


Treten auf z.b. hier:
C++:
template<class T>
List<T>::Iterator List<T>::insert(Iterator pos, const T& d)  /// <------- HIER
{
    if (pos.the_list != this)
      throw std::invalid_argument("List::insert");
    Element<T> *pnew = new Element<T>(pos.cur, pos.cur->pre, d);
    pos.cur->pre->suc = pnew;
    pos.cur->pre = pnew;
    sz++;
    return List::Iterator(this, pnew);
}

template<class T>
List<T>::Iterator& List<T>::Iterator::operator++ ()    // UND HIER
{
    if (not the_list or *this == the_list->end())
      throw std::out_of_range("Iterator::operator++");
    cur = cur->suc;
    return *this;
}

Ich verstehe die Meldung so das ich einen Konstruktor, Destruktor und/oder Type-Converter brauche(Iterator) aber auch das habe ich "extra" mal reingebaut und immernoch das gleiche, somit muss der Fehler woanders liegen, leider habe ich hier zu wenig Erfahrung.
Ich hoffe ihr findet den Fehlerteufel, ich bin mir fast sicher das es total banal scheint aber das zugehörige Buch meint das es so gehen sollte...

Danke
 
Hi.
Ich hoffe ihr findet den Fehlerteufel, ich bin mir fast sicher das es total banal scheint aber das zugehörige Buch meint das es so gehen sollte...
Dein Buch scheint etwas alt zu sein. Evlt. solltest du dir ein besseres zulegen...
C++:
template<class T>
typename List<T>::Iterator List<T>::insert(Iterator pos, const T& d) 
...

template<class T>
typename List<T>::Iterator& List<T>::Iterator::operator++ ()
Grund des Fehlers: Der Compiler kann nicht ohne Instanzierung von List<T> mit einem konkreten Typ für T wissen, ob List<T>::Iterator ein Typ ist oder nicht.

Gruß
 
Herzlichen Dank das war es. Hat das damit zu tun weil die Klasse Iterator gekapselt ist ?
Sonst kam sowas nie. Du hast Recht das Buch ist von 1998 und ich habe es mir von der Uni-Bibliothek ausgeliehen, lustig das damals der Compiler keine Probleme damit hatte. :)

Jetzt kann ich endlich weitermachen Dankeschön.

mfg
 
Zurück