2

今週、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.
4

3 に答える 3

1

まず、テンプレートはヘッダー ファイルにのみ実装する必要があります。テンプレートをヘッダー ファイルにしか実装できないのはなぜですか? を参照してください。

はクラスでDLNodeはなく、クラス テンプレートであるため、常にテンプレート引数、つまりDLNode<T>orを持つ必要があり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 */
于 2013-04-06T05:02:01.013 に答える
0
//forgot something here?
DLNode::~DLNode() {
    delete next;
}

コンストラクタについても同様です。すべての関数定義の前にテンプレート宣言を使用します。

于 2013-04-06T04:52:22.203 に答える
0

少なくとも 2 つの問題があります。デフォルトのコンストラクタとデストラクタの宣言が で始まらないことtemplate<class T>です。

于 2013-04-06T04:56:24.350 に答える