我试图在C++中实现一个通用链表,但我遇到了一个不知道如何处理的错误。
以下是我的Link类实现(也是通用的(:
#ifndef LINK_H
#define LINK_H
#include <iostream>
#include "typeinfo.h"
#include "LinkedList.h"
template <class T>
class Link
{
public:
//|-------------------- Constructors --------------------
Link(T data): m_data(data), next(NULL){}
//|-------------------- Methods --------------------
T getData(){
return m_data;
}
T& getNext(){
return next;
}
void setNext(Link* newLink){
next = newLink;
}
void setData(T data){
m_data = data;
}
//|-------------------- Operator overload --------------------
bool operator==(Link& other){
if(this->m_data == other.m_data)
return true;
return false;
}
void operator++(){
this = this->next;
}
//|-------------------- Friend functions --------------------
friend std::ostream& operator<<(std::ostream& out,const Link<T>& link){
out<<link.m_data;
return out;
}
//|-------------------- Destructor --------------------
virtual ~Link(){}
protected:
private:
//|-------------------- Private fields --------------------
T m_data;
Link<T>* next;
friend class LinkedList<T>
};
#endif // LINK_H
正如你所看到的,我正试图让LinkedList<T>
成为Link<T>
的朋友,这样我就可以访问它的领域(我希望他们保持隐私(。
现在,我认为发布我所有的LinkedList<T>
实现是相关的,因为它有很多代码,但以下是我如何定义类:
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include "List.h"
#include "Link.h"
template <class T>
class LinkedList : public List<T>
{
public:
以下是字段:
private:
//|-------------------- Private fields --------------------
Link<T>* head;
现在,我得到这个错误:
error: 'LinkedList' is not a class template
我已经尝试搜索错误并找到了这个。但这似乎不是我执行过程中的问题。
我也发现了这个。但我不明白在我的情况下如何实现这个转发声明(或者为什么我甚至需要它(。
我真的很感激在这里澄清。
提前感谢
只需在Link
类的定义之前添加LinkedList
的前向声明,如下所示:
template<typename U>
class LinkedList;
// Now the definition as you have it above...
template <class T>
class Link
{
public:
...
请参见此处。
顺便说一句,在你的第一个代码块中,你的朋友声明后缺少了一个;
。