2011-07-04 20 views
2

私は(ちょうど楽しみのために)リストを実装しています:C++エラー: '*' の前に期待される初期化子:

#include <iostream> 

template <class T> 
class list { 

private: 
    struct node { 
     T data; 
     struct node *next, *prev; 
    } head; 

    unsigned int length; 

public: 

    class iterator { 

    private: 
     node *ptr; 

    public: 
     iterator(); 
     inline T& operator *(); 
     inline iterator operator ++(); 
     inline iterator operator ++(int); 
     inline iterator operator --(); 
     inline iterator operator --(int); 

    }; 

    list(); 
    //~list() 

    inline unsigned int size() const; 
    inline bool empty() const; 
    inline iterator begin(); 
    inline iterator end(); 
    inline T& front(); 
    inline T& back(); 
    //void insert (iterator position, const T &x); 
    //void push_back (const T &x); 
    //void push_front (const T &x); 
    //void pop_back(); 
    //void pop_front(); 

}; 

template <class T> 
inline list<T>::iterator::iterator() { 

    ptr = NULL; 

} 

template <class T> 
inline T& list<T>::iterator::operator*() { 

    return ptr->data; 

} 


template <class T> 
inline iterator list<T>::iterator::operator++() { 

    ptr = ptr->next; 
    return *this; 

} 

template <class T> 
inline iterator list<T>::iterator::operator++(int) { 

    iterator tmp = ptr; 
    ptr = ptr->next; 
    return tmp; 

} 

template <class T> 
inline iterator list<T>::iterator::operator --() { 

    ptr = ptr->prev; 
    return *this; 

} 

template <class T> 
inline iterator list<T>::iterator::operator --(int) { 

    iterator tmp = ptr; 
    ptr = ptr->prev; 
    return tmp; 

} 

//////////////////// 
//////////////////// 

template <class T> 
inline list<T>::list() { 

    head.next = &head; 
    head.prev = &head; 
    length = 0; 


} 

template <class T> 
inline unsigned int list<T>::size() const { 

    return length; 

} 

template <class T> 
inline bool list<T>::empty() const { 

    return length == 0; 

} 

template <class T> 
inline iterator list<T>::begin() { 

    return head->next; 

} 

template <class T> 
inline iterator list<T>::end() { 

    return &head; 

} 

template <class T> 
inline T& list<T>::front() { 

    return *begin(); 

} 

template <class T> 
inline T& list<T>::back() { 

    return *(--end()); 

} 

そして、私はこのエラーを取得しています:

list.h:64: error: expected initializer before ‘list’ 
list.h:72: error: expected initializer before ‘list’ 
list.h:81: error: expected initializer before ‘list’ 
list.h:89: error: expected initializer before ‘list’ 
list.h:125: error: expected initializer before ‘list’ 
list.h:132: error: expected initializer before ‘list’ 

いいえ私はセミコロンを紛失していません。

答えて

2

定義がクラス外であるため、ネストされた型イテレータは有効範囲にありません。それは動作しません

template <class T> 
inline typename list<T>::iterator list<T>::iterator::operator++() { 
+0

する必要がありますあなたはiterator

template <class T> inline iterator list<T>::iterator::operator++() { 

への参照を修飾する必要があり、私は同じエラー – NDakota

+0

ああ、GNUコンパイラを取得しますか? – sehe

+0

FWIW GCC上でコンパイルできたことを確認しました - 申し訳ありませんが、最初はテストしませんでした。 – sehe

関連する問題