一个模板类内声明模板友元类编译器错误
-
22-09-2019 - |
题
我一直在努力实现自己的链表类教学目的。
我指定的“列表”类的迭代器声明中的朋友,但它似乎并没有进行编译。
这些是我使用了3类的接口:
<强> Node.h:强>
#define null (Node<T> *) 0
template <class T>
class Node {
public:
T content;
Node<T>* next;
Node<T>* prev;
Node (const T& _content) :
content(_content),
next(null),
prev(null)
{}
};
<强> Iterator.h:强>
#include "Node.h"
template <class T>
class Iterator {
private:
Node<T>* current;
Iterator (Node<T> *);
public:
bool isDone () const;
bool hasNext () const;
bool hasPrevious () const;
void stepForward ();
void stepBackwards ();
T& currentElement () const;
friend class List<T>;
};
<强> List.h 强>
#include <stdexcept>
#include "Iterator.h"
template <class T>
class List {
private:
Node<T>* head;
Node<T>* tail;
unsigned int items;
public:
List ();
List (const List<T>&);
List& operator = (const List<T>&);
~List ();
bool isEmpty () const {
return items == 0;
}
unsigned int length () const {
return items;
}
void clear ();
void add (const T&);
T remove (const T&) throw (std::length_error&, std::invalid_argument&);
Iterator<T> createStartIterator () const throw (std::length_error&);
Iterator<T> createEndIterator () const throw (std::length_error&);
};
这是测试程序中,我一直在试图运行:
<强> trial.cpp 强>
using namespace std;
#include <iostream>
#include "List/List.cc"
int main ()
{
List<int> myList;
for (int i = 1; i <= 10; i++) {
myList.add(i);
}
for (Iterator<int> it = myList.createStartIterator(); !it.isDone(); it.stepForward()) {
cout << it.currentElement() << endl;
}
return 0;
}
当我尝试编译,编译器给了我以下错误:
<强> Iterator.h:26:错误:“列表”是不是一个模板强>
<强> Iterator.h:在“迭代”的实例:强>
<强> trial.cpp:18:从此处强>
实例化<强> Iterator.h:12:错误:对“结构列表” 强>
所需模板参数<强> List.cc:在成员函数“迭代一览:: createStartIterator()const的[与T = INT]”:强>
<强> trial.cpp:18:从此处强>
实例化<强> Iterator.h:14:错误:迭代::迭代器(节点*)[用T = INT]'是私人强>
<强> List.cc:120:错误:在这一范围内强>
好像它不能识别的朋友声明。 我有什么错?
解决方案
尝试加入前向声明
template <class T> class List;
在Iterator.h
的开始 - 这可能是你所需要的,让friend
类作品里面的Iterator
声明
其他提示
问题是名单尚未在Iterator.h正确声明。相反,窝内列表(自动将使它成为一个模板),你可能会希望无论如何做迭代器类(而不是使用它重命名为的ListIterator或IteratorForList列表:迭代,因为你将有一个以上的迭代器在一个命名空间)。
template<class T>
struct List {
//...
struct Node {/*...*/};
struct Iterator {
// ...
private:
Iterator(Node*);
friend class List; // still required
};
//...
};
不隶属于 StackOverflow