scusa puoi provare a compilare questo codice?...è quello di prima solo con le modifiche che mi hai suggerito...
codice:
//main.cpp
#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;
	char aa=diz.RicercaChiave(2);
	cout<<aa<<endl;
	diz.EliminaChiave(2);
	char bb=diz.RicercaChiave(2);
	cout<<bb<<endl;
    return 0;
}
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=100,double constA=0.445){
			  if(DimensioniTabella=!0){
				  Tabella=new Lista[DimensioniTabella];
		  }
		  }
          ~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);
				   S Ricerca(T);
				   S Cancella(T);
				   int RestituisciNumElementi(){return NumElementiDellaLista;}
				   bool 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;}
			 
			 protected:
             
             virtual unsigned long ConvertiChiave(T);
             double constA;
		     int DimensioniTabella;			 
             int GeneraHashVal(T);
             Lista *Tabella;
};

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->ElementoSuccssivo;
		}while(y->ElementoSuccssivo!=0);
        y->ElementoSuccssivo=x;
        x->ElementoPrecedente=y;
		NumElementiDellaLista++;
		return 1;
	}
}

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


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);
	S dato=Tabella[hashVal].Ricerca(chiave);
	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
A me nn da errori di compilazione ma di link...e sono quelli che ho scritto prima..
Ah se ti da errori di compilazione me li potresti postare?Altrimenti mi sa che nn ne vengo fuori..
PS Grazie per la pazienza..