0

テンプレートを使用して C++ を練習するための一般的なリンク リスト クラスを作成しようとしています。ただし、コンパイル時にエラーが発生し、それらを解決する方法がわかりません。1 つのエラーをデバッグしようとして 2 時間以上費やしましたが、どこにも行きませんでした。MSDN と google にも相談しましたが、どこにも行きませんでした。テンプレートに関しては、私はかなり経験が浅いのではないかと心配しています。関連するコードを以下にリストしました。誰かが私を助けてくれれば幸いです。

LinkedList.h:

    #ifndef LINKED_LIST
    #define LINKED_LIST

    namespace D_DATA_STRUCT {
        template <typename T>
        class LinkedList {
        private:    
            class LinkedListNode {
            public:

                T data;
                LinkedListNode* next;
                LinkedListNode(T data) {
                    this->data = data;
                    this->next = 0;
                }
            };

            LinkedListNode* head;
            LinkedListNode* tail;

        public:

            LinkedList();
            ~LinkedList();

            void insert_at_head(T data);
            void insert_at_tail(T data);
            void insert(T data);

            T remove_from_head();
            T remove();
        };
     }

    #include "LinkedListImplementation.h"
    #endif

LinkedListImplementation.h:

     namespace D_DATA_STRUCT {

        template <typename T>
        LinkedList<typename T>::LinkedList() {
            this->head = 0;
            this->tail = 0;
        }

        template<typename T>
        LinkedList<typename T>::~LinkedList() {
             LinkedListNode* prev, next;
             for(prev = this->head; prev != 0; prev = prev->next) {
                next = prev->next;
                delete prev;
                prev = next;
             }
        }

        template<typename T>
        void LinkedList<typename T>::insert_at_head(T data) {
             LinkedListNode* temp = this->head;
             this->head = new LinkedListNode(data);
             this->head->next = temp;
             if(temp == 0) {
                 this->tail = this->head;
             }
             return;
        }

        template<typename T>
        void LinkedList<typename T>::insert_at_tail(T data) {
             LinkedListNode* temp = new LinkedListNode(data);
             if(this->head == 0) {
                 this->head = temp;
             } else {
                 this->tail->next = temp;
             }
             this->tail = temp;
             return;
        }

        template<typename T>
        void LinkedList<typename T>::insert(T data) {
            this->insert_at_head(data);
            return;
        }

        template<typename T>
        T LinkedList<typename T>::remove_from_head() {
            if(this->head == 0) {
                return 0;
            }

            LinkedListNode* temp = this->head;
            T data = temp->data;

            this->head = this->head->next;
            delete temp;

            if(this->head == 0) {
                this->tail = 0;
            }

            return data;
         }

         template<typename T>
         T LinkedList<typename T>::remove() {
             return this->remove_from_head();
         }
    }

私が得るエラーは次のとおりです。

linkedlistimplementation.h(4): エラー C2143: 構文エラー: ';' がありません '<' の前にlinkedlistimplementation.h(4): エラー C4430: 型指定子がありません - int と見なされます。注: C++ は、default-int をサポートしていません。linkedlistimplementation.h(4): エラー C2988: 認識できないテンプレート宣言/定義です。 'LinkedList' : '`グローバル名前空間'' のメンバーではありません。以前のエラー; コンパイルの停止

「;」には構文エラーがありますが、プログラムはコンパイルされましたが、誤ってlinkedlistimplementationlinkedlist.cppを作成したときにリンクに失敗しました。したがって、テンプレートの構文に問題があると思います。私は多くのドキュメントを調べ、多くのことを試しましたが、率直に言って、何が起こっているのかわかりません。LinkedList:: 内で typename を使用してコンパイルしようとしましたが、それを使用しませんでした。

Microsoft Visual C++ 2010 Express コンパイラも使用しています。

ありがとうございました!

4

4 に答える 4

2

する必要があります:

template <typename T>
LinkedList<T>::LinkedList()
于 2013-01-03T19:01:58.590 に答える
2

他にエラーがあるかどうかはわかりませんが、すぐに思いついたのは、関数定義では「typename」を 2 回必要とせず、「template. "

例として:
あなたのコンストラクタは定義されています

template <typename T>
    LinkedList<typename T>::LinkedList() {
        this->head = 0;
        this->tail = 0;
    }

いつあるべきか

template <typename T>
    LinkedList<T>::LinkedList() {
        this->head = 0;
        this->tail = 0;
    }

すべての関数定義でその変更を加えれば、問題ありません。

于 2013-01-03T19:06:40.260 に答える
1

実装宣言が間違っているので、クラス名にそのtypname部分を含めるべきではありません。実装のコンストラクターを次のように変更します

template<typename T>
LinkedList<T>::LinkedList() {
    // ...
}

他の方法についても同じようにします。

于 2013-01-03T19:02:27.470 に答える