Salve, nn riesco a compilare questo programma in c++, mi continua a dare errori di link che nn mi spiego...mi potete dare una mano??

codice:
//dizionario.h
//Implementazione di un dizionario tramite programmazione generica[template] 

#ifndef DIZ_H
#define DIZ_H
#include <cmath>

template<class T,class S>class Dizionario{

      public:
		  Dizionario(int DimensioniTabella=5,double constA=0.445){
			  if(DimensioniTabella=!0){
//				  Lista Tabella[DimensioniTabella];
				  Tabella=new Lista[DimensioniTabella];
			//	  PROVA=new Lista;
		  }
		  }
          ~Dizionario(){delete []Tabella;}

   		     class Lista{
			   public: 
				    Lista(){PrimoElemento=0;}

				               class Elemento {
				                               public:
                                                     Elemento(){
                                                     ElementoSuccessivo=0;
													 ElementoPrecedente=0;
                                                     chiave=0;     
													 }
						                       ~Elemento(){}
                                               Elemento * ElementoPrecedente;
											   Elemento * ElementoSuccessivo;
                                               T chiave;
											   S datoSatellite;
							   };
                   
                   bool InserisciElemento(T,S);
				   Elemento * Ricerca(T);
				   S Cancella(T);
				   int RestituisciNumElementi(){return NumElementiDellaLista;}
				   void SettaPrimoElemento(Elemento *q){PrimoElemento=q;}
				   Elemento * RestituisciPrimoElemento(){return PrimoElemento;}
				   static int NumElementiDellaLista;
				private:

				   Elemento * PrimoElemento;
                   
                   
			 };
            
			 bool InserisciChiave(T,S);
             S EliminaChiave(T);
			 S RicercaChiave(T);
             int FattoreDiCarico();
			 int RestituisciDimensioniTab(){return DimensioniTabella;}
			 Lista * Tabella;
            // Lista PROVA;//lista di prova
			// Lista Tabella[5];
			 protected:
             
             virtual unsigned long ConvertiChiave(T);
             double constA;
		     int DimensioniTabella;			 
             int GeneraHashVal(T);
             
};

template <class T,class S>int Dizionario<T,S>::Lista::NumElementiDellaLista=0; 


//funzioni classe Lista
template <class T,class S>bool Dizionario<T,S>::Lista::InserisciElemento(T chiave,S dato){
	Elemento *x=new Elemento();
    Elemento *y=0;
    y=RestituisciPrimoElemento();
	x->chiave=chiave;
	x->datoSatellite=dato;
	if(y==0){SettaPrimoElemento(x);}
	else{
		 do{
		y=y->ElementoSuccessivo;
		}while(y->ElementoSuccessivo!=0);
        y->ElementoSuccessivo=x;
        x->ElementoPrecedente=y;
		NumElementiDellaLista++;
		return 1;
	}
}

	
template <class T,class S>Dizionario<T,S>::Lista::Elemento * Dizionario<T,S>::Lista::Ricerca(T chiave){
	Elemento *y=0;
    y=RestituisciPrimoElemento();
	while((y!=0) && (y->chiave!=chiave)){
		y=y->ElementoSuccessivo;}
	return y;
}


template <class T,class S>S Dizionario<T,S>::Lista::Cancella(T chiave){
	Elemento *y=0;
	y=Ricerca(chiave);
	if((y!=0)&&(y->chiave==chiave)){
		y->ElementoPrecedente->ElementoSuccessivo=y->ElementoSuccessivo;
		if(y->ElementoSuccessivo!=0){
			y->ElementoSuccessivo->ElementoPrecedente=y->ElementoPrecedente;
		}
		NumElementiDellaLista--;
        return y->datoSatellite;
	}else{
		return 0;
	}
}


//Funzioni classe Dizionario
template <class T,class S>int Dizionario<T,S>::FattoreDiCarico(){
	double media;
	int dim=RestituisciDimensioniTab();
	for(int i=0;i<dim;i++){
		media=media + Tabella[i].RestituisciNumElementi();
	}
	media=media/dim;
	return media;
}

template <class T,class S>int Dizionario<T,S>::GeneraHashVal(T chiave){
	int dim=RestituisciDimensioniTab();
    unsigned long val=ConvertiChiave(chiave);
	double HashFunzDouble=(fmod((constA*val),1)*dim);
    double fraz=modf(HashFunzDouble,&HashFunzDouble);
	int HashFunz=(int)HashFunzDouble;
	return HashFunz;
}


template <class T,class S>bool Dizionario<T,S>::InserisciChiave(T chiave,S dato){
	int hashVal=GeneraHashVal(chiave);
	if(Tabella[hashVal].InserisciElemento(chiave,dato)){return 1;}
	return 0;
}

template <class T,class S>S Dizionario<T,S>::RicercaChiave(T chiave){
    int hashVal=GeneraHashVal(chiave);
	Dizionario<T,S>::Lista::Elemento *y=Tabella[hashVal].Ricerca(chiave);
	S dato=y->datoSatellite;
	if(dato!=0){return dato;}
	return 0;
}

template <class T,class S>S Dizionario<T,S>::EliminaChiave(T chiave){
    int hashVal=GeneraHashVal(chiave);
	S dato=Tabella[hashVal].Cancella(chiave);
	if(dato!=0){return dato;}
	return 0;
}


template <class T,class S>unsigned long Dizionario<T,S>::ConvertiChiave(T chiave){
	unsigned long a=static_cast<unsigned long>(chiave);
	return a;
}



#endif
codice:
#include "dizionario.h"
#include <iostream>
using namespace std;
int main(){
	
	Dizionario<int,char> diz(10);
	diz.InserisciChiave(2,'a');
	diz.InserisciChiave(6,'x');
	diz.InserisciChiave(8,'q');
	char qq=diz.RicercaChiave(5);
	cout<<qq<<endl;
	cout<<6<<endl;
	char aa=diz.RicercaChiave(2);
	cout<<aa<<endl;
	diz.EliminaChiave(2);
	char bb=diz.RicercaChiave(2);
	cout<<bb<<endl;
    return 0;
}
e questi sono gli errori...
################################################## ###########
--------------------Configuration: dizion - Win32 Release--------------------
Compiling...
main.cpp
Linking...
main.obj : error LNK2001: unresolved external symbol "public: char __thiscall Dizionario<int,char>::Lista::Cancella(int)" (?Cancella@Lista@?$Dizionario@HD@@QAEDH@Z)
main.obj : error LNK2001: unresolved external symbol "public: class Dizionario<int,char>::Lista::Elemento * __thiscall Dizionario<int,char>::Lista::Ricerca(int)" (?Ricerca@Lista@?$Dizionario@HD@@QAEPAVElemento@12 @H@Z)
main.obj : error LNK2001: unresolved external symbol "public: bool __thiscall Dizionario<int,char>::Lista::InserisciElemento(int ,char)" (?InserisciElemento@Lista@?$Dizionario@HD@@QAE_NHD @Z)
Release/dizion.exe : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.

dizion.exe - 4 error(s), 0 warning(s)
################################################## ########### Avevo gia chiesto in questo forum, ma la persona che cercava di aiutarmi nn riceveva gli stessi errori miei compilando il programma, potrei sapere se a voi linkando da gli stessi errori?
Potreste anche consigliarmi qualche compilatore free per c++ scaricabile da internet?
Grazie