2012-04-24 5 views
1

私は楽しいために自分自身の二重リンクリストの実装を作成しています。リスト自体を書き終えましたが、今はイテレータを追加しようとしています。私はこのようなものの構文規則について混乱しています。ここで私が取得していますエラーされます。その下にテンプレート化された二重リンクリストのイテレータを作成する際の問題

/****************************/ 
/* d_list class    */ 
/* with exceptions classes */ 
/****************************/ 
class d_list_error{}; 
class d_list_empty{}; 

template <class T> 
class d_list_iter; 

template <class T> 
class d_list{ 
public: 
    d_list(); 
    d_list(const d_list &_dl); 
    d_list &operator=(const d_list &_dl); 
    ~d_list(); 

    void push_back(T item); 
    void push_front(T item); 

    void pop_back(); 
    void pop_front(); 

    bool isEmpty() const; 
    unsigned int size() const; 

    void clear(); 
private: 
    struct node{ 
     node *prev; 
     node *next; 
     T data; 
    }; 
    node    *head; 
    node    *tail; 
    unsigned int  currSize; 
    d_list_iter<T> *dli; 

    /* Utility Functions */ 
    void initFirstEle(T item, node* first); 
    void copyAll(const d_list<T> &_dl); 
}; 

/*************************/ 
/* d_list iterator class */ 
/*************************/ 

class d_iter_already_exists {}; 

template <class T> 
class d_list_iter{ 
public: 
    d_list_iter(const d_list &_dl); 
    ~d_list_iter(); 
    T getNext() const; 

private: 
    friend class d_list; 
    d_list<T> *dl; 
    node  *next; 
    node  *prev; 
    bool  valid; 
}; 

d_listのために定義されたすべてのメンバ関数である:

error C2990: 'd_list' : non-class template has already been declared as a class template 

は、ここでは全てに位置し、ヘッダファイルがあります。私はイテレーターのためにそれらをまだ書いていない。 d_listは私のすべてのテストに基づいて完全に動作しています。私はシンタックスエラーに遭遇していると思います。これは私にとって未知の領域です。

+0

少なくとも最初の努力では、イテレータクラスを反復するクラスの中にネストして書くのが最も簡単です。 –

+0

それはスマートだったでしょう... – Slims

+0

まあ...それはどちらかの方法で行うことができます。イテレータを実際に外に置くと、コンテナが不完全な型で動作するようになります。また、iteratorクラスはネストされていてもテンプレートでなければなりません。なぜなら、余分なパラメータを 'const_iterator'から' iterator'を と区別する必要があるからです。 – Potatoswatter

答えて

3

クラス宣言の外側でテンプレートパラメータを指定することによってテンプレート化タイプを指定する必要があります。

具体的には、d_listの代わりに、template <typename> class d_list_iterの宣言の代わりにd_list<T>と書く必要があります。これにはfriendの使用が含まれます。

ノードにも同じことが適用されます。彼らはデモのために公開されていると仮定してください:nodeの代わりにtemplate <typename> class d_list_iterの宣言の代わりに、デモのために公開されていると仮定してください:

typename d_list<T>::node

+0

ありがとう、これは働いた! – Slims

+0

@Slimsようこそ – justin

関連する問題