C++ C++;具有多重继承的LinkedList模板?

C++ C++;具有多重继承的LinkedList模板?,c++,templates,multiple-inheritance,C++,Templates,Multiple Inheritance,我正在尝试创建一个LinkedList类,该类具有多态性,并从堆栈和队列头文件继承。这是我第一次尝试使用模板,但不断出现诸如“类模板已定义”或“不允许抽象类类型”之类的错误。我如何实现一个模板,因为我显然做得不正确 // LinkedList.h File #include "Stack.h" #include "Queue.h" #include "Node.h" using namespace std; template <typename T> class LinkedLi

我正在尝试创建一个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文件
#包括“Stack.h”
#包括“Queue.h”
#包括“Node.h”
使用名称空间std;
模板
类LinkedList:公共队列、公共堆栈
{
公众:
LinkedList();
~LinkedList(无效);
受保护的:
节点*第一;
节点*最后;
int numItems;
};
//LinkedList.cpp文件
#包括“LinkedList.h”
使用名称空间std;
模板
类链接列表
{
LinkedList()
{
第一个=空;
last=NULL;
numItems=0;
}
LinkedList::~LinkedList(无效)
{
while(第一个!=NULL)
{
节点*cur=第一个;
第一个=第一个->下一个;
删除cur;
}
}
LinkedList::clear(){}
LinkedList::size(){}
//堆栈函数
LinkedList::推送(T项){}
LinkedList::pop(){}
LinkedList::top(){}
//队列函数
LinkedList::排队(T项){}
LinkedList::出列(){}
LinkedList::peek(){}
}
//Stack.h文件(除了push/pop/top=enqueue/dequeue/peek外,队列相同)
#布拉格语一次
模板类堆栈
{
公众:
虚拟~Stack(){}
虚拟整数大小()=0;
虚空清除()=0;
虚空推送(T项)=0;
虚拟T pop()=0;
虚拟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;

};
//LinkedList.h文件
#布拉格语一次
#包括“Stack.h”
#包括“Queue.h”
#包括“Node.h”
模板
类LinkedList:公共队列、公共堆栈
{
公众:
LinkedList();
~LinkedList(无效);
无效清除();
int size();
无效推送(T项);
T pop();
T-top();
无效排队(T项);
T退出队列();
T peek();
受保护的:
节点*第一;
节点*最后;
int numItems;
};
//LinkedList.cpp文件
#包括“LinkedList.h”
类链接列表
{
LinkedList::LinkedList()
{
第一个=空;
last=NULL;
numItems=0;
}
LinkedList::~LinkedList(无效)
{
while(第一个!=NULL)
{
节点*cur=第一个;
第一个=第一个->下一个;
删除cur;
}
}
LinkedList::clear(){}
LinkedList::size(){}
//堆栈函数
void LinkedList::推送(T项){}
T LinkedList::pop(){}
T LinkedList::top(){}
//队列函数
void LinkedList::排队(T项){}
T LinkedList::dequeue(){}
T LinkedList::peek(){}
}
//Stack.h文件(除了push/pop/top=enqueue/dequeue/peek外,队列相同)
#布拉格语一次
模板类堆栈
{
公众:
虚拟~Stack(){}
虚拟整数大小()=0;
虚空清除()=0;
虚空推送(T项)=0;
虚拟T pop()=0;
虚拟T top()=0;
};
我明白了

// LinkedList.cpp File
模板定义必须在每个翻译单元上都可见,您不能将它们的定义放在cpp文件中并期望它工作(就像它在常规类中所做的那样)。所有模板函数的定义都应该出现在头文件中

此外,编译器错误是正确的。您正在为两个
LinkedList
类编写定义。我猜你在寻找:

LinkedList::LinkedList(){ ... }

因此,我应该在LinkedList.h文件中实现我的模板,并在cpp文件中以独立LinkedList::FunctionName()的形式编写我的函数,而不作为类的一部分?@LF4:对于常规类通常是这样。编写模板时,需要在头文件中定义函数。它们是在类内定义还是在类外定义基本上是不相关的,除非定义在类外时,您应该将其声明为
inline
。我想我的问题是在哪里/如何编写模板类的函数?都在模板里?谢谢您的帮助。@LF4:您的更新代码仍然在谈论模板的cpp文件。尝试使用您的cpp文件,移动其定义并使用它们替换头文件中的定义。你仍然会有错误,但你会更接近一个解决方案。哇,我希望老师们能明智地选择他们的词汇。我曾经说过“头文件中没有代码”,而实际上应该是“头文件中没有代码,但模板除外,稍后您将了解这些模板”。谢谢,那是我一直在砸的砖墙。