Ajuda em erros de compilação (desafio)

Pessoal, como vai?
Estou fazendo um projeto (trabalho grande ) para a faculdade que é sobre um Sistema de Gerenciamento de uma biblioteca Eletrônica. Na verdade ele só simula…
O meu problema consiste em uma lista que eu fiz para guardar os Usuarios registrados no sistema e que funciona perfeitamente para os tipos básicos (int, double, char, etc…).
Mas quando eu uso o tipo Usuário(uma classe criado por mim que contem id, password, etc…) acontece um erro… Na verdade são três erros que não achei a fonte.
Farei o seguinte: postarei aqui o código ( da lista, usuário e da classe Login que é a que ta dando pau ) que é meio grande; e enquanto vocês me ajudam, eu vou terminando as outras
classes.
Mais uma dúvida… Se eu fizer uma árvore ( já fiz ) de Usuário, eu posso guardar nela o tipo professor, ou o tipo aluno ou mesmo admin? Um admin é um
professor, um professor é um aluno e um aluno é um Usuario. (conceito de herança.)

ps: desconfio que o problema seja no Template. Porque o compilador parece que nao reconhece usuario como classe…
Ficarei muito grato caso descubram o erro. Obrigado.
lá vai o código(parte dele):

//ARQUIVO ESTRUTURAS.CPP
#include "header.h"
//LISTA

template<class T>
void Lista<T>::inserehead(T &x) {
	node<T> *p;
	p = new node<T> ();
	p->setdado(x);
	if (n == 0) {
		head = p;
		tail = p;
		p->setprox(NULL);
		p->setant(NULL);
	} else {
		p->setant(head);
		head->setprox(p);
		head = p;
	}
	set_n(get_n() + 1);
}
template<class T>
void Lista<T>::inseretail(T &x) {
	node<T> *p;
	p = new node<T> ();
	p->setdado(x);
	if (n == 0) {
		head = p;
		tail = p;
		p->setprox(NULL);
		p->setant(NULL);
	} else {

		p->setprox(tail);
		tail->setant(p);
		tail = p;
	}
	set_n(get_n() + 1);
}
template<class T>
void Lista<T>::print() {
	node<T> *p;
	if (head == NULL)
		cout << "Lista vazia!";
	p = tail;
	while (p->getprox() != NULL) {
		cout << " " << p->getdata().get_id();
		p = p->getprox();
	}
	cout << " " << p->getdata().get_id();
}
template<class T>
void Lista<T>::inseremeio(T &x, unsigned n) {
	unsigned i = 1;
	node<T> *p, *k;
	p = tail;
	if (n > get_n() + 1) {
		cout << "ERRO, Nao pode inserir elemento nessa posicao!!";
		fflush(stdin);
		getchar();
		exit(1);
	} else if (n == get_n() + 1)
		inserehead(x);
	else if (n == 1)
		inseretail(x);
	else {
		while (i < n) {
			p = p->getprox();
			i++;
		}
		k = new node<T> ();
		k->setdado(x);
		k->setant(p->getant());
		k->setprox(p);
		p->setant(k);
		k->getant()->setprox(k);
		set_n(get_n() + 1);
	}
}
template<class T>
T Lista<T>::acesso(unsigned n) {
	int i = 0;
	node<T> *p;
	p = tail;
	if (n == 1)
		return tail->getdata();
	else if (n == get_n())
		return head->getdata();
	while (i < n - 1) {
		p = p->getprox();
		i++;
	}
	return p->getdata();
}
template<class T>
void Lista<T>::removemeio(unsigned n) {
	unsigned i = 1;
	node<T> *p;
	p = tail;
	if (n > get_n() + 1 || get_n() == 0) {
		cout
				<< "ERRO, Nao pode remover elemento nessa posicao OU LISTA VAZIA!!";
		fflush(stdin);
		getchar();
	} else if (n == get_n() + 1)
		removehead();
	else if (n == 1)
		removetail();
	else {
		while (i < n) {
			p = p->getprox();
			i++;
		}
		p->getant()->setprox(p->getprox());
		p->getprox()->setant(p->getant());
		delete (p);
		set_n(get_n() - 1);
	}
}
template<class T>
void Lista<T>::removehead() {
	node<T> *p;
	p = head;
	if (get_n() == 0) {
		cout << "ERRO, LISTA VAZIA!";
		fflush(stdin);
		getchar();
	} else if (get_n() == 1) {
		sethead(NULL);
		settail(NULL);
		delete (p);
		set_n(get_n() - 1);
	} else {
		p->getant()->setprox(NULL);
		sethead(p->getant());
		delete (p);
		set_n(get_n() - 1);
	}
}
template<class T>
void Lista<T>::removetail() {
	node<T> *p;
	p = tail;
	if (get_n() == 0) {
		cout << "ERRO, LISTA VAZIA!";
		fflush(stdin);
		getchar();
	} else {
		p->getprox()->setant(NULL);
		settail(p->getprox());
		delete (p);
		set_n(get_n() - 1);
	}
}

Arquivo header.cpp (classe LOGIN DANDO ERRO!!! Comentei no local…

#include <iostream>
#include <string.h>
using namespace std;
//USUARIO!!!!!!!!!!
class Usuario {
public:
	Usuario();//construtor padr?o
	Usuario(string, string, string);
	void download(Acervo&);
	string get_id() const {
		return id;
	}
	string get_pass() const {
		return pass;
	}
	string get_nome() const {
		return nome;
	}

private:
	string id;
	string pass;
	string nome;
	int downloads;
};
//LOGIN!!!
class Login {
public:
	Login() {
		user = NULL;
	}
	bool log();//Implementar na classes.cpp
	Usuario get_user(int n) {
		return banco_user.acesso(n); //ERRO DANDO AQUI!!!
	}
	Usuario* get_current() {
		return user;
	}
	void set_user(Usuario *x) {
		banco_user.inserehead(*x);// OUTRO ERRO AQUI!!!!
	}

	void logoff() {
		user = NULL;
	}

private:
	Lista <Usuario> banco_user; //ERRO AQUI!!!
	Usuario* user;

};

Os erros são os seguintes:

**** Build of configuration Debug for project DOOLPI ****

make all
Building file: …/main.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "…/main.cpp"
In file included from …/main.cpp:1:
…/header.h:81: error: ISO C++ forbids declaration of ‘Lista’ with no type
…/header.h:81: error: expected ‘;’ before ‘<’ token
…/header.h: In member function ‘Usuario Login::get_user(int)’:
…/header.h:67: error: ‘banco_user’ was not declared in this scope
…/header.h: In member function ‘void Login::set_user(Usuario*)’:
…/header.h:73: error: ‘banco_user’ was not declared in this scope
make: *** [main.o] Error 1

Olá.
Não estou lá muito quente em C++.

Mas me lembro que já tive problemas com classes template.

O que me lembro é que quando queria usar uma classe template, eu não podia separar ela em arquivos .h e .cpp. Sempre dava pau.

Então, para classes template eu criava somente o arquivo .h e colocava os métodos já implementados no próprio .h.

Se não me engano, já li sobre isso no www.cplusplus.com.

Falou.

EDIT: Achei o seguinte:

“Implementing template member functions is somewhat different compared to the regular class member functions. The declarations and definitions of the class template member functions should all be in the same header file. The declarations and definitions need to be in the same header file”

Fonte : link.

Então, já aboli o template… Continua dando erro… Mas obrigado pela dica!!

O erro continua sendo o mesmo e no mesmo lugar?

Ao abolir o template, os erros são os seguintes :

make all
Building file: …/main.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "…/main.cpp"
In file included from …/main.cpp:1:
…/header.h:81: error: ‘Lista’ does not name a type
…/header.h: In member function ‘Usuario Login::get_user(int)’:
…/header.h:67: error: ‘banco_user’ was not declared in this scope
…/header.h: In member function ‘void Login::set_user(Usuario*)’:
…/header.h:73: error: ‘banco_user’ was not declared in this scope
make: *** [main.o] Error 1

Acho que sei qual o erro, mas não sei como arrumar…

Se eu mudo a ordem das declarações, algumas coisas funcionam e outras não. por exemplo : se eu coloco o protótipo da classe lista antes da classe Node, dá um erro… ou antes da classe usuario… Muito estranho, não deveriam rodar mesmo estando declarados em ordem diferente? obrigado.