Error del compilador al declarar la clase de amigo de plantilla dentro de una clase de plantilla
He estado intentando implementar mi propia clase de lista vinculada con fines didácticos.
Especifiqué la clase "Lista" como amigo dentro de la declaración del iterador, pero no parece compilar.
Estas son las interfaces de las 3 clases que he usado:
Nodo.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)
{}
};
Iterador.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>;
};
Lista.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&);
};
Y este es el programa de prueba que he estado tratando de ejecutar:
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;
}
Cuando intento compilarlo, el compilador me da los siguientes errores:
Iterator.h: 26: error: "Lista" no es una plantilla
Iterador.h: En la instanciación de ‘Iterador’:
trial.cpp: 18: instanciado desde aquí
Iterator.h: 12: error: argumento de plantilla requerido para la 'lista de estructuras'
List.cc: En la función miembro ‘Iterator List :: createStartIterator () const [with T = int]’:
trial.cpp: 18: instanciado desde aquí
Iterator.h: 14: error: ‘Iterator :: Iterator (Nodo *) [con T = int]’ es privado
List.cc:120: error: dentro de este contexto
Parece que no está reconociendo la declaración de amigo. ¿Qué hice mal?