1

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

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

すべてが配置されているヘッダーファイルは次のとおりです。

/****************************/
/* 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 用に定義されたすべてのメンバー関数があります。イテレータ用にまだ書き始めていません。d_list は、すべてのテストに基づいて完全に機能しています。これは私にとって未知の領域であるため、構文エラーが発生しているだけだと思います。

4

1 に答える 1

3

クラス宣言の外でテンプレート パラメーターを指定して、テンプレート化された型を指定する必要があります。

具体的にはd_list<T>、単にの宣言d_list内ではなく (のようなもの) を記述する必要があります。template <typename> class d_list_iterこれには、の使用が含まれますfriend

同じことがノードにも当てはまります。デモンストレーションのために公開されていると仮定します。

typename d_list<T>::nodeの宣言node内の代わりに。template <typename> class d_list_iter

于 2012-04-24T03:55:48.140 に答える