2016-04-05 6 views
0

私はリンクされたリストでキューを作っています。リンクされたリストは2つのクラスと1つの構造体です。IListは抽象クラスであり、ListはIListから継承します。奇妙なエラーがなくても私のキューからListクラスにアクセスできないようです。テンプレートクラスへのポインタを作成する方法、C++

template <typename T> 
class IList{ 
public: 
    virtual ~IList(); 
    virtual void add(const T& element) = 0; 

    //all functions here are pure virtual 
}; 



template <typename T> 
class List : public IList<T>{ 
private: 

    struct Node{ 
     T data; 
     Node* next; 
    }; 

Node* current; 
int nrOfElements; 

public: 
    List(); 
    ~List(); 
    List(const List& origObj); 
    void operator=(const List& origObj); 
    virtual void add(const T& element); 
}; 


//class definition 

私のListクラスのすべてのfunktionsが正常に動作しますが、私はqueue.hからアクセスしようとしたとき、私は2つのエラー

エラー1つのエラーLNK2019取得:未解決の外部シンボル「パブリック:仮想__thiscallのIListを:: 〜のIList(無効)」(?? 1?$のIList @ H @@ UAE @ XZ)機能__unwindfunclet $ ?? 0?$一覧で参照@ H @@ QAE @ ABV0 @@ Z $ 0

エラー2エラーLNK1120:未解決の外部が1個

キューはIQueueとIQueueから継承仮想デストラクタは、それは純粋であっても、実装を持っている必要があります

template <typename T> 
class Queue : public IQueue<T>{ 

private: 
    List<T>* aList; //I can't access List via aList-> 

public: 
    Queue(); 
    Queue(const Queue& origObj); 
    void operator=(const Queue& origObj); 
    virtual ~Queue(); 
    virtual void enqueue(const T& element); 
    virtual T dequeue() const throw(...); 
    virtual T& front() throw(...); 
    virtual bool isEmpty() const; 
}; 
+0

をしなければならないの.hと.cppのファイルにクラスを分け偶然あなたをしましたか? – NathanOliver

+0

いいえ、すべての定義は同じファイルにあります – Mallom

+0

すべてはどのようにコンパイルされていますか? – NathanOliver

答えて

1

抽象クラスです。だから、Why a pure virtual destructor needs an implementationを参照してください、あなたは

template <typename T> 
class IList{ 
public: 
    virtual ~IList(); 
    virtual void add(const T& element) = default; 

    //all functions here are pure virtual 
}; 

または

template <typename T> 
class IList{ 
public: 
    virtual ~IList(); 
    virtual void add(const T& element) = 0; 

    //all functions here are pure virtual 
}; 

template <typename T> 
IList<T>::~IList(){} 
+0

なぜあなたは= 0の代わりにデフォルトを書いたのですか? – Mallom

+0

デストラクタを純粋な仮想にすることはできません。私が0にしても、私は実装を提供する必要があります。だから私はそれをデフォルトまたは純粋な仮想だが、追加の実装で行うことができる。関連する他の質問へのリンクを読み、もっと説明があります。 – user2807083

関連する問題