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; } #endife questi sono gli errori...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; }
################################################## ###########
--------------------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

Rispondi quotando