Undefined reference all'operator<<

di il
3 risposte

Undefined reference all'operator<<

Io ho la mia classe IntegerList che estende da List<T> e quest'ultima a sua volta utilizza Nodo<T> per contenere le informazioni.
Nel file list.cpp vado a definire l'overloading dell'operator<< per stampare il contenuto di una lista in questo modo:
template <typename T>
ostream& operator<<(ostream& output, const List<T>& lista)
{
	Nodo<T>* aux = lista.head;
	
	if (aux == NULL)
		output << "Lista vuota.";
	else
	{
		while (aux != NULL)
		{
			output << aux->getValue() << " ";
			aux = aux->getNext();
		}
	}
	
	return output;
}
e nel main vado a chiamare quest'operatore con
cout << list
(dove list è un'istanza di IntegerList).
Il linker però mi dà quest'errore quando provo a compilare il sorgente:
Errore LNK2019 riferimento al simbolo esterno "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class List<int> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$List@H@@@Z) non risolto nella funzione _main

ma ho incluso l'header iostream e il namespace std in tutti gli header del progetto (list.hpp, nodo.hpp, integerList.h e nel main) ma nonostante questo continua a darmi quell'errore, mentre tutte le altre funzioni template le legge senza problemi.
qualcuno mi saprebbe aiutare?

3 Risposte

  • Re: Undefined reference all'operator<<

    Devi spostare la definizione della funzione template nell'header file e renderla inline. Infatti non si può inserire delle funzioni template in un file .cpp senza esplicitarne il tipo reale.
    Il fatto che le altre funzioni template sembrino funzionare non è significativo: solo le funzioni template effettivamente usate vengono instanziate, le altre no.
  • Re: Undefined reference all'operator<<

    shodan ha scritto:


    Devi spostare la definizione della funzione template nell'header file e renderla inline. Infatti non si può inserire delle funzioni template in un file .cpp senza esplicitarne il tipo reale.
    Il fatto che le altre funzioni template sembrino funzionare non è significativo: solo le funzioni template effettivamente usate vengono instanziate, le altre no.
    mmmh.. ma ho trovato un piccolo escamotage per dichiarare le funzioni template esternamente dal .h seguendo queste istruzioni.
    il problema è che con questa funzione friend non funziona...
  • Re: Undefined reference all'operator<<

    Se noti, viene incluso file.cpp dentro file.h, pertanto anche file.cpp di fatto diventa un header file, per cui si ricade in quello che ho detto sopra.
    In questo caso comunque file.cpp lo chiamerei file.tpl per non creare confusione. Infatti si da pressoché scontato che i files.cpp vengano compilati e linkati, non inclusi in qualche header file.

    Il fatto che non funzioni dice poco: hai risolto l'errore di linking ma hai errore di compilazione?
    Se posti il codice della definizione della classe List<T> sarebbe meglio (a partire dall'ultimo header file incluso in quel file header).
Devi accedere o registrarti per scrivere nel forum
3 risposte