0

Stack および Queue ヘッダー ファイルからポリモーフィズムと継承を使用して LinkedList クラスを作成しようとしています。テンプレートを使用しようとしたのはこれが初めてですが、「クラス テンプレートは既に定義されています」や「抽象クラス タイプは許可されていません」などのエラーが発生し続けます。明らかに間違っているので、テンプレートを実装するにはどうすればよいですか?

// LinkedList.h File
#include "Stack.h"
#include "Queue.h"
#include "Node.h"

using namespace std;

template <typename T>
class LinkedList : public Queue<T>, public Stack<T>
{
public:
    LinkedList();
    ~LinkedList(void);

protected:
    Node<T> *first;
    Node<T> *last;
    int numItems;
};

// LinkedList.cpp File
#include "LinkedList.h"

using namespace std;

template <typename T>
class LinkedList
{
    LinkedList()
    {
        first = NULL;
        last = NULL;
        numItems = 0;
    }

    LinkedList::~LinkedList(void)
    {
        while (first != NULL)
        {
            Node* cur = first;
            first = first->next;
            delete cur;
        }
    }

    LinkedList::clear() {}    
    LinkedList::size() {}

    // Stack Functions
    LinkedList::push(T item) {}    
    LinkedList::pop() {}    
    LinkedList::top() {}

    // Queue Functions
    LinkedList::enqueue(T item) {}    
    LinkedList::dequeue() {}    
    LinkedList::peek() {}
}

// Stack.h File (Queue is the same except push/pop/top = enqueue/dequeue/peek)
#pragma once

template <typename T> class Stack
{

public:

  virtual ~Stack() {}

  virtual int size() = 0;
  virtual void clear() = 0;
  virtual void push(T item) = 0;
  virtual T pop() = 0;
  virtual T top() = 0;

};

更新されたコード

// LinkedList.h File
#pragma once
#include "Stack.h"
#include "Queue.h"
#include "Node.h"

template <typename T>
class LinkedList : public Queue<T>, public Stack<T>
{
public:
    LinkedList();
    ~LinkedList(void);

    void clear();
    int size();

    void push(T item);
    T pop();
    T top();

    void enqueue(T item);
    T dequeue();
    T peek();


protected:
    Node<T> *first;
    Node<T> *last;
    int numItems;
};

// LinkedList.cpp File
#include "LinkedList.h"

class LinkedList
{
    LinkedList::LinkedList()
    {
        first = NULL;
        last = NULL;
        numItems = 0;
    }

    LinkedList::~LinkedList(void)
    {
        while (first != NULL)
        {
            Node* cur = first;
            first = first->next;
            delete cur;
        }
    }

    LinkedList::clear(){}
    LinkedList::size(){}

    // Stack Functions
    void LinkedList::push(T item){}
    T LinkedList::pop(){}
    T LinkedList::top(){}

    // Queue Functions
    void LinkedList::enqueue(T item){}
    T LinkedList::dequeue(){}
    T LinkedList::peek(){}
}


// Stack.h File (Queue is the same except push/pop/top = enqueue/dequeue/peek)
#pragma once

template <typename T> class Stack
{

public:

  virtual ~Stack() {}

  virtual int size() = 0;
  virtual void clear() = 0;
  virtual void push(T item) = 0;
  virtual T pop() = 0;
  virtual T top() = 0;

};
4

1 に答える 1

1

そうですか

// LinkedList.cpp File

テンプレート定義はすべての翻訳単位で表示される必要があります。それらの定義を cpp ファイルに配置して、それが機能することを期待することはできません (通常のクラスの場合のように)。すべてのテンプレート関数の定義は、ヘッダー ファイルに存在する必要があります。

また、コンパイラ エラーは正しいです。LinkedList2 つのクラスの定義を作成しています。私はあなたが探していたと思います:

LinkedList::LinkedList(){ ... }
于 2012-05-26T23:25:27.583 に答える