0

我一直在尝试制作一个通用链表类来使用模板练习我的 C++。但是,在编译时我收到错误,我对如何解决它们一无所知。我花了 2 多小时试图调试一个错误,但完全无处可去。我还咨询了 MSDN 和 google,也没有得到任何结果。恐怕我在模板方面相当缺乏经验。我在下面列出了相关代码。如果有人可以帮助我,我将不胜感激。

链表.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++ 不支持默认整数linkedlistimplementation.h(4):错误C2988:无法识别的模板声明/定义linkedlistimplementation.h(4):错误C2059:语法错误:'<'linkedlistimplementation.h(4):错误C2039: “LinkedList”:不是“全局命名空间”的成员linkedlistimplementation.h(10):错误C2588:“::~LinkedList”:非法全局析构函数linkedlistimplementation.h(10):致命错误C1903:无法从中恢复以前的错误;停止编译

即使“;”存在语法错误 当我错误地制作linkedlistimplementationlinkedlist.cpp时,程序编译但链接失败。因此,我认为我的模板语法存在一些问题。我浏览了很多文档并尝试了很多东西,但坦率地说,我迷路了,不知道发生了什么。我尝试在 LinkedList:: 中使用 typename 进行编译,但没有它。

我还在使用 Microsoft Visual C++ 2010 Express 编译器。

谢谢!

4

4 回答 4

2

another problem is in this line

LinkedListNode* prev, next;

only prev is a pointer to LinkedListNode. next will be an object and will try to call the default constructor of LinkedListNode which does not exist.

If you want both of them to be pointers it should be changed to

LinkedListNode *prev, *next;
于 2013-01-03T19:08:19.010 回答
2

应该:

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

我不知道是否还有其他错误,但立即让我印象深刻的是,在您的函数定义中,您不需要两次“typename”,您只需在以“template.name”开头的行中使用它。 "

例如:
您的构造函数已定义

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 回答