C ++模板疑难解答简介

时间:2013-04-06 04:46:06

标签: c++ class templates

我们本周开始在我们的CSS课程中使用模板,但是,当我们开始在实验室中深入研究它们时,我们无法理解的一些问题开始显现。

我们收到以下错误:

../Lab7PartC/DLNode.cpp:13:5: error: invalid use of template-name ‘lab7::DLNode’ without an argument list
../Lab7PartC/DLNode.cpp:20:5: error: invalid use of template-name ‘lab7::DLNode’ without an argument list
../Lab7PartC/DLNode.cpp:26:5: error: expected unqualified-id before ‘template’
../Lab7PartC/DLNode.cpp:33:5: error: invalid use of template-name ‘lab7::DLNode’ without an argument list

以下是相关的.cpp文件:

/*
 * DLNode.cpp
 *
 *  Created on: Mar 29, 2013
 *      Author: tony
 */

#include <cstddef>
#include "DLNode.h"

namespace lab7 {

    DLNode::DLNode() {
        data = 0;
        next = NULL;
        prev = NULL;
    }

    template<class T>
    DLNode::DLNode(T d) {
        data = d;
        next = NULL;
        prev = NULL;
    }

    template<class T>
    DLNode::DLNode(T d, DLNode* n, DLNode* p) {
        data = d;
        next = n;
        prev = p;
    }

    DLNode::~DLNode() {
        delete next;
    }



} /* namespace lab7 */

以下是相关的.h文件:

/*
 * DLNode.h
 *
 *  Created on: Mar 29, 2013
 *      Author: tony
 */

#ifndef DLNODE_H_
#define DLNODE_H_

namespace lab7 {
    template<class T>
    class DLNode {
    public:
        DLNode();
        DLNode(T data_in);
        DLNode(T data_in, DLNode* n, DLNode* p);
        virtual ~DLNode();

        void setNext(DLNode* n) {
            next = n;
        }

        void setPrev(DLNode* p) {
            prev = p;
        }

        int getData() {
            return data;
        }

        DLNode* getNext() {
            return next;
        }

        DLNode* getPrev() {
            return prev;
        }
    private:
        T data;
        DLNode* next;
        DLNode* prev;
    };

} /* namespace lab7 */
#endif /* DLNODE_H_ */

我们花了一个晚上试图解决这个问题,并感谢任何有关该主题的建议。感谢。

我讨厌再次打扰你,但我修改了头文件以包含你建议的整个定义,这就是我所拥有的,这次我包括使用节点类的附加类:

/*
 * DLNode.h
 *
 *  Created on: Mar 29, 2013
 *      Author: tony
 */

#ifndef DLNODE_H_
#define DLNODE_H_

namespace lab7 {

    template<class T>
    class DLNode {
    public:
        DLNode<T>();
        DLNode<T>(T data_in);
        DLNode<T>(T data_in, DLNode* n, DLNode* p);
        ~DLNode<T>();

        void setNext<T>(DLNode* n) {
            next = n;
        }

        void setPrev<T>(DLNode* p) {
            prev = p;
        }

        int getData<T>() {
            return data;
        }

        DLNode* getNext<T>() {
            return next;
        }

        DLNode* getPrev<T>() {
            return prev;
        }
    private:
        T data;
        DLNode* next;
        DLNode* prev;
    };

    template<class T>
    DLNode<T>::DLNode() {
        data = 0;
        next = NULL;
        prev = NULL;
    }

    template<class T>
    DLNode<T>::DLNode(T d) {
        data = d;
        next = NULL;
        prev = NULL;
    }

    template<class T>
    DLNode<T>::DLNode(T d, DLNode* n, DLNode* p) {
        data = d;
        next = n;
        prev = p;
    }

    template<class T>
    DLNode<T>::~DLNode() {
        delete next;
    }
} /* namespace lab7 */
#endif /* DLNODE_H_ */

- 以及附加列表类头文件:

/*
 * DLList.h
 *
 *  Created on: Mar 29, 2013
 *      Author: tony
 */

#ifndef DLLIST_H_
#define DLLIST_H_


namespace lab7 {

    class DLNode<T>;

    template<class T>
    class DLList {
    public:
        DLList();
        virtual ~DLList();
        void insert(T data);
        void print();
        bool search(const T key);
        bool searchandremove(const T key);
        void swap();
        DLNode* findNode(const T key);
    private:
        DLNode* first;
    };

    template<class T>
    DLList<T>::DLList() {
        first = NULL;
    }

    template<class T>
    DLList<T>::~DLList() {
        delete first;
    }

    template<class T>
    void DLList<T>::insert(T data) {
        DLNode<T>* temp = first;
        first = new DLNode(data, first, NULL);
        if (temp == NULL)
            return;
        temp->setPrev(first);
    }

    template<class T>
    void DLList<T>::print() {
        DLNode* temp = first;
        while (temp != NULL) {
            cout << temp->getData() << " ";
            temp = temp->getNext();
        }
        cout << endl;
    }

    template<class T>
    bool DLList<T>::search(const T key) {
        DLNode* temp = new DLNode;
        bool found = false;
        for (temp = first; temp != NULL; temp = temp->getNext()) {
            if (temp->getData() == key)
                found = true;
        }
        return found;
    }

    template<class T>
    bool DLList<T>::searchandremove(const T key) {
        DLNode* prev = new DLNode;
        DLNode* next = new DLNode;
        DLNode* toDelete = new DLNode;
        toDelete = findNode(key);
        if (toDelete != NULL) {
            prev = toDelete->getPrev();
            next = toDelete->getNext();
            toDelete->setNext(NULL);
            toDelete->setPrev(NULL);
            if (toDelete == first) {
                first = next;
                next->setPrev(first);
            } else {

                prev->setNext(next);
                if (next != NULL)
                    next->setPrev(prev);
            }
            delete toDelete;
            return true;
        }
        return false;
    }

    template<class T>
    DLNode* DLList<T>::findNode(const T key) {
        DLNode* temp = new DLNode;
        for (temp = first; temp != NULL; temp = temp->getNext()) {
            if (temp->getData() == key)
                return temp;
        }
        return NULL;
    }

    template<class T>
    void DLList<T>::swap() {
        DLNode* last = new DLNode;
        //navigate to second to last node
        for (last = first; last->getNext() != NULL; last = last->getNext()) {
        }
        last->getPrev()->setNext(first);
        first->setPrev(last->getPrev());
        last->setPrev(NULL);
        last->setNext(first->getNext());
        first->getNext()->setPrev(last);
        first->setNext(NULL);
        first = last;

    }
} /* namespace lab7 */
#endif /* DLLIST_H_ */

另外还有一些我不理解的错误:

In file included from ../Lab7PartC/Lab7B.cpp:13:0:
../Lab7PartC/DLList.h:14:11: error: ‘DLNode’ is not a template
../Lab7PartC/DLList.h:14:18: error: ‘T’ was not declared in this scope
../Lab7PartC/DLList.h: In member function ‘void lab7::DLList<T>::insert(T)’:
../Lab7PartC/DLList.h:43:9: error: ‘lab7::DLNode’ is not a template
../Lab7PartC/DLList.h:47:13: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h: In member function ‘void lab7::DLList<T>::print()’:
../Lab7PartC/DLList.h:54:25: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:55:24: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h: In member function ‘bool lab7::DLList<T>::search(T)’:
../Lab7PartC/DLList.h:62:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:64:53: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:65:21: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h: In member function ‘bool lab7::DLList<T>::searchandremove(T)’:
../Lab7PartC/DLList.h:73:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:74:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:75:32: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:78:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:79:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:80:21: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:81:21: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:84:21: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:87:21: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:89:25: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h: In member function ‘lab7::DLNode* lab7::DLList<T>::findNode(T)’:
../Lab7PartC/DLList.h:99:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:100:53: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:101:21: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h: In member function ‘void lab7::DLList<T>::swap()’:
../Lab7PartC/DLList.h:109:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:111:32: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:111:64: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:113:13: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:114:14: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:114:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:115:13: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:116:13: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:116:28: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:117:14: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:118:14: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h: In member function ‘void lab7::DLList<T>::insert(T) [with T = int]’:
../Lab7PartC/Lab7B.cpp:23:26:   instantiated from here
../Lab7PartC/DLList.h:44:9: error: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: error: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h: In member function ‘bool lab7::DLList<T>::searchandremove(T) [with T = int]’:
../Lab7PartC/Lab7B.cpp:34:32:   instantiated from here
../Lab7PartC/DLList.h:91:13: warning: possible problem detected in invocation of delete operator:
../Lab7PartC/DLList.h:75:17: warning: ‘toDelete’ has incomplete type
../Lab7PartC/DLList.h:14:11: warning: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:91:13: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined.
../Lab7PartC/DLList.h: In destructor ‘lab7::DLList<T>::~DLList() [with T = int]’:
../Lab7PartC/Lab7B.cpp:46:1:   instantiated from here
../Lab7PartC/DLList.h:38:9: warning: possible problem detected in invocation of delete operator:
../Lab7PartC/DLList.h:38:9: warning: invalid use of incomplete type ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:14:11: warning: forward declaration of ‘struct lab7::DLNode’
../Lab7PartC/DLList.h:38:9: note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined.

3 个答案:

答案 0 :(得分:1)

首先,模板应该只在头文件中实现。见Why can templates only be implemented in the header file?

现在,DLNode不是一个类,它是一个类模板,所以它应该总是有一个模板参数,即DLNode<T>DLNode<int>。现在,您可能想知道为什么不在类体中执行此操作,例如void setNext(DLNode* n),这是因为该参数隐含在类范围内。

我写的内容似乎令人困惑,但这就是一切应该看起来的样子:

template<class T>
DLNode<T>::DLNode() {
    data = 0;
    next = NULL;
    prev = NULL;
}

template<class T>
DLNode<T>::DLNode(T d) {
    data = d;
    next = NULL;
    prev = NULL;
}

template<class T>
DLNode<T>::DLNode(T d, DLNode* n, DLNode* p) {
    data = d;
    next = n;
    prev = p;
}

template<class T>
DLNode<T>::~DLNode() {
    delete next;
}

正如我所说,这段代码需要在头文件而不是cpp文件中。虽然一旦你这样做,在类体之外定义它们变得毫无意义,所以只需在类体内定义所有内容:

namespace lab7 {
    template<class T>
    class DLNode {
    public:
        DLNode() {
            data = 0;
            next = NULL;
            prev = NULL;
        }

        // ...
    };

} /* namespace lab7 */

答案 1 :(得分:0)

//forgot something here?
DLNode::~DLNode() {
    delete next;
}

构造函数相同。 在每个函数定义之前使用模板声明。

答案 2 :(得分:0)

至少有两个问题:默认构造函数和析构函数声明不以template<class T>开头。