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?

questionAnswers(2)

yourAnswerToTheQuestion