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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta