Newsgroup: it.comp.lang.c++
Titolo: egcs e funzioni template

Salve,
Ho notato un comportamento strano per le funzioni template in egcs-2.91.66
Sostanzialmente ho scritto una funzione template che fa delle assunzioni sul tipo, in particolare si aspetta una classe che abbia certi metodi e certi campi.
In particolare ognuna delle classi per cui voglio istanziare la funzione template definisce un tipo (con lo stesso nome per tutte) e un metodo che restituisce un reference a un oggetto di quel tipo.
La funzione template si fa restituire questo reference e ci fa delle operazioni sopra. (Non e' una tecnica molto elegante, ma e' una funzione che ho scritto al volo, per questioni di debug)
Il codice e' riportato in fondo.
Ma veniamo al sodo: 
il compilatore su Digital Unix compila tutto senza problemi mentre egcs mi da i seguenti errori:
biglietti.cpp: In function `int DumpBiglietti(const T &, class ostream &)':
biglietti.cpp:106: parse error before `&'   
biglietti.cpp: In function `int DumpBiglietti<A_1101_1>(const class A_1101_1 &, class ostream &)':
biglietti.cpp:190:   instantiated from here
biglietti.cpp:109: `lista' undeclared (first use this function)
biglietti.cpp:109: (Each undeclared identifier is reported only once
biglietti.cpp:109: for each function it appears in.)
biglietti.cpp:113: confused by earlier errors, bailing out           
Sembrerebbe che egcs provi a compilare (almeno in parte ??) la funzione 
template prima di istanziarla per qualche tipo specifico, e in questo modo non "digerisce" la dichiarazione della variabile lista alla riga 106.
Quando inoltre, prova a istanziare la funzione per una determinata classe (classe che definisce il tipo "ListaBiglietti" e il metodo geBiglietti()) trova la variabile lista come non dichiarata!
(perche' ha toppato la  dichiarazione alla riga 106).
Se non sbaglio, la compilazione delle funzioni template andrebbe fatta interamente durante l'istanziazione, ma probabilmente l'egcs, forse per ottimizzare, ne pre-compila una parte nella dichiarazione
e "riempie i buchi" nell'istanziazione.
Visto che la mia piattaforma target e' Digital-Unix, il problema non e' grave (tra l'altro la funzione in questione ha soli scopi di debug, e verra' eliminata). Pero' la cosa mi ha incuriosito un po'.
Che ne pensate ? ( Come si comportano altri compilatori ?)
template <class T>
int DumpBiglietti(const T &body, ostream &out)
{
    const T::ListaBiglietti & lista = body.getBiglietti(); // riga 106
    int i;
    for( i=0; i< lista.getSize(); i++)
    {
        out << lista[i] << endl;
    }
    return i;
}
*Fabio*
-- 
Many people feel that if you won't let them make you happy, they'll make you
suffer.

     const T::ListaBiglietti & lista = body.getBiglietti(); // riga 106
Per compilare con egcs ci vuole typename:
  const typename T::ListaBiglietti & lista = body.getBiglietti();
altrimenti, non conoscendo T, non puo' sapere che ListaBiglietti
e' un tipo (potrebbe essere una variabile, una funzione,  ...).
Altri compilatori riescono a capirlo da soli.
Penso che in questi casi il typename sia obblibgatorio secondo
lo standard, pero' non sono sicuro.
	Mauro

         Mauro
Funziona!
A suo tempo non avevo capito bene l'utilizzo di "typename" e l'avevo "rimosso". Adesso mi e' tutto piu' chiaro.
Grazie
*Fabio*
-- 
As Gen. de Gaulle occassionally acknowledges America to be the daughter
of Europe, so I am pleased to come to Yale, the daughter of Harvard.
		-- J.F. Kennedy