Erro do compilador ao declarar uma classe de amigo de modelo dentro de uma classe de modelo
Eu tenho tentado implementar minha própria classe de lista vinculada para fins didáticos.
Eu especifiquei a classe "List" como amigo dentro da declaração Iterator, mas não parece compilar.
Estas são as interfaces das 3 classes que usei:
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&);
};
E este é o programa de teste que estou tentando executar:
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;
}
Quando eu tento compilá-lo, o compilador me dá os seguintes erros:
Iterator.h: 26: erro: "Lista" não é um modelo
Iterator.h: Na instanciação de "Iterator":
trial.cpp: 18: instanciado daqui
Iterator.h: 12: erro: argumento do modelo necessário para "lista de estruturas"
List.cc: Na função de membro ‘Iterator List :: createStartIterator () const [com T = int]’:
trial.cpp: 18: instanciado daqui
Iterator.h: 14: erro: "Iterator :: Iterator (Node *) [com T = int]" é privado
List.cc:120: erro: neste contexto
Parece que não está reconhecendo a declaração de amizade. Onde foi que eu errei?