0

クラス テンプレートを使用して C++ で順序付きリスト データ構造を実装しています。簡単にするために、各コンストラクターと関数をインラインで実装しました。このプロジェクト用に独自の Node クラスを作成しました。

コンパイラ エラーは、この質問の最後に貼り付けられています。「`Node::~Node()' への未定義の参照」。テンプレートを使用するのはこれが初めてで、このエラーはこれまで見たことがありません。どこから始めればよいかわかりません。どんな助けでも大歓迎です!

Node.h

#ifndef NODE_H
#define NODE_H

#include <iostream>
#include <cstdlib>

template <class E>
class Node {
public:
    Node(const E init_data = NULL, Node<E>* init_link = NULL){data = init_data; link = init_link;}
    Node(const Node<E>& orig){data = orig.getData(); setLink = NULL;}
    virtual ~Node();

    E getData() const{return data;}
    void setData(E newData){data = newData;}

    Node<E>* getLink(){return link;}
    void setLink(Node<E>* nextLink) {link = nextLink;}
private:
    E data;
    Node<E>* link;
};

#endif  /* NODE_H */

MyOrderedList.h

#ifndef MYORDEREDLIST_H
#define MYORDEREDLIST_H

#include <iostream>
#include <cstdlib>
#include "Node.h"

template <class E>
class MyOrderedList;
template <class E>
std::ostream& operator <<(std::ostream& out, const MyOrderedList<E>& list);

template <class E>
class MyOrderedList {
public:
    MyOrderedList()
    {/*IMPLEMENTATION*/}

    MyOrderedList(const MyOrderedList<E>& orig)
    {/*IMPLEMENTATION*/}

    void operator =(const MyOrderedList<E>& orig)
    {/*IMPLEMENTATION*/}

    virtual ~MyOrderedList()
    {/*IMPLEMENTATION*/}

    bool remove(E data)
    {/*IMPLEMENTATION*/}

    MyOrderedList<E> kLargest(int k) const
    {/*IMPLEMENTATION*/}

    E get(int pos) const
    {/*IMPLEMENTATION*/}

    void insert(E data)
    {/*IMPLEMENTATION*/}

    MyOrderedList<E> operator +(const MyOrderedList<E>& list)
    {/*IMPLEMENTATION*/}

    friend std::ostream& operator <<(std::ostream& out, const MyOrderedList<E>& list)
    {/*IMPLEMENTATION*/}

private:
    Node<E>* head;
    int size;
};

#endif  //MYORDEREDLIST_H

main.cpp

#include <cstdlib>
#include <iostream>
#include "MyOrderedList.h"

using namespace std;

int main(int argc, char** argv) 
{
    MyOrderedList<int> list;
    list.insert(5);
    std::cout << list << std::endl;;

    return 0;
}

コンパイラ エラー

g++     -o dist/Debug/Cygwin-Windows/project7_windows build/Debug/Cygwin-Windows/main.o  
build/Debug/Cygwin-Windows/main.o: In function `_ZN4NodeIiE7getLinkEv':
/cygdrive/c/Users/John/Desktop/Dropbox/Data Structures/Project7 Windows/MyOrderedList.h:(.rdata$_ZTV4NodeIiE[vtable for Node<int>]+0x8): undefined reference to `Node<int>::~Node()'
/cygdrive/c/Users/John/Desktop/Dropbox/Data Structures/Project7 Windows/MyOrderedList.h:(.rdata$_ZTV4NodeIiE[vtable for Node<int>]+0xc): undefined reference to `Node<int>::~Node()'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/Cygwin-Windows/project7_windows.exe] Error 1

make[1]: * [.build-conf] エラー 2 make: * [.build-impl] エラー 2

4

2 に答える 2

1

コンパイラが正確に述べているように、宣言し~Node()ましたが、定義したことはありません。の実装を提供する必要がありますNode::~Node()

于 2012-04-15T23:03:59.953 に答える
0

これ

class Node {
  virtual ~Node(); 
};

Node の仮想デストラクタを宣言します (ただし、定義はしません) (ここではテンプレート性は問題になりません)。次のいずれかを行う必要があります

  1. この行を削除します (したがって、コンパイラが提供するデフォルトの実装を使用します) または
  2. 定義も提供します。

.

class Node {
  virtual ~Node() { /* put your dtor logic here */ } 
};

Node の dtor に多くのロジックを入れることができないため、Node から継承する予定がない限り、宣言を削除することを恐れないでください。それはそのテンプレート タイプについてあまり知りません。次のノード ( ) へのポインターを削除する予定がない限りNode::link、これはおそらく危険な提案です。

于 2012-04-15T23:07:54.987 に答える