Buona sera, sto riscontrando dei problemi col seguente snippet di codice, relativo all'implementazione di una lista lineare generica con template:
#include <iostream>
using namespace std;
class Transazione
{
public:
Transazione(string f, string t, int q);
private:
string FROM;
string TO;
int QT;
};
Transazione::Transazione(string f, string t, int q)
{
FROM=f;
TO=t;
QT=q;
}
template <class TIPO> class Nodo
{
public:
void set_next(Nodo <TIPO> *ptr);
Nodo <TIPO> *get_next();
void set_dati(TIPO data);
TIPO get_dati();
private:
TIPO dati;
Nodo *next;
};
template <class TIPO> void Nodo <TIPO>::set_next(Nodo <TIPO> *ptr)
{
next=ptr;
}
template <class TIPO> Nodo <TIPO> *Nodo <TIPO> ::get_next()
{
return next;
}
template <class TIPO> void Nodo <TIPO>::set_dati(TIPO data)
{
dati=data;
}
template <class TIPO> TIPO Nodo <TIPO>::get_dati()
{
return dati;
}
template <class TIPO> class Lista
{
public:
Lista();
void aggiungi_in_coda(TIPO data);
void stampa_lista();
private:
Nodo <TIPO> *head;
Nodo <TIPO> *tail;
};
template <class TIPO> Lista <TIPO>::Lista()
{
head=nullptr;
tail=nullptr;
}
template <class TIPO> void Lista <TIPO>::aggiungi_in_coda(TIPO data)
{
if(head==nullptr)
{
head=new Nodo <TIPO>;
head->set_dati(data);
head->set_next(nullptr);
tail=head;
}
else
{
Nodo <TIPO> *punt=new Nodo <TIPO>;
punt->set_dati(data);
punt->set_next(nullptr);
tail->set_next(punt);
tail=punt;
}
}
template <class TIPO> void Lista <TIPO>::stampa_lista()
{
Nodo <TIPO> *ptr=head;
while(ptr->get_next()!=nullptr)
{
cout<<ptr->get_dati()<<endl;
ptr=(ptr->get_next());
}
cout<<ptr->get_dati()<<endl;
ptr->set_next(ptr->get_next());
}
int main()
{
Lista <Transazione> obj1;
Transazione obj2("192.168.1.87", "192.168.1.17", 150);
obj1.aggiungi_in_coda(obj2);
obj1.stampa_lista();
return 0;
}
Quando compilo il programma, mi dà una sfilza di errori, del tipo:
main.cpp:77:8: error: use of deleted function ‘Nodo<Transazione>::Nodo()’
head=new Nodo <TIPO>;
main.cpp:84:21: error: use of deleted function ‘Nodo<Transazione>::Nodo()’
Nodo <TIPO> *punt=new Nodo <TIPO>;
main.cpp:98:7: error: no match for ‘operator<<’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘Transazione’)
cout<<ptr->get_dati()<<endl
/usr/include/c++/8/ostream:682:5: error: no type named ‘type’ in ‘struct std::enable_if<false, std::basic_ostream<char>&>’
Ho letto sul mio libro di C++ che quando il tipo generico di una classe templata (quello che qui ho chiamato TIPO) viene sostituito da un tipo non standard, ad esempio una classe definita dall'utente (come nel mio caso, la classe Transazione), il compilatore segnalerà un errore se non è stato ridefinito l'operatore utilizzato. Infatti se utilizzo la seguente dichiarazione:
Lista <int> obj1;
Passando pertanto valori interi alla funzione per aggiungere nodi alla lista, il programma funziona tranquillamente, anche per qualsiasi altro tipo di dato standard. Come posso risolvere questo problema, effettuando l'overload degli operatori che qui vengono utilizzati per inserire i nodi e stampare la lista? Ci sto perdendo un'intera giornata.