Newsgroup: it.comp.lang.c++
Titolo: Aiuto warning da classe Template

Il mio problema e' questo
il compilatore della GNU per UNIX mi da' questo warning al momento di
compilare una classe Tamplate 
Matrix.C:277: warning: friend declaration `class ostream & operator
<<(class 
ostream &, class matrix<jolly> &)'
Matrix.C:277: warning:   will not be treated as a template instantiation
e tutto va bene nel mio programma finche non uso proprio quella funzione.
In quel momento il Linker mi da un errore di non definizione di funzione.
Riporto il codice qui sotto.
friend ostream &operator<<(ostream &stream, matrix<jolly> &a);
template <class jolly> ostream &operator<<(ostream &stream, matrix<jolly>
&a){
  nod<jolly> *u;
  u=a.k;
  stream<<endl;
  while(u->succ){
    stream << *u;
    u=u->succ;
  }
  stream << endl;
  return stream;
}//matrix <<
La prima riga e' la dichiarazione della funzione friend all'interno della 
classe.
grazie mille a tutti 
ciao

Calignano Marco 409565/IF wrote in message ...
    [snip]
L'impressione e` che tu stia usando una versione vecchia
di gcc, con un supporto sub-standard per i template.
Prova a scaricare (da 
www.cygnus.com
) e istallare egcs 1.1,
la versione piu` aggiornata di gcc; dovrebbe essere molto
meglio allineata allo Standard, e quindi, in particolare, avere
il necessario supporto per usi avanzati dei template come
quello che stai cercando di fare (un function-template friend
di un class-template).
Se per qualche ragione non puoi aggiornare il tuo compilatore,
e sei costretto a continuare ad usare una versione vecchia,
dovrai aggirare il problema; ad esempio, per evitare che la
funzione debba essere friend della classe, puo` spesso
bastare introdurre nella classe un accessore pubblico di
adeguata funzionalita`.  Mi spiego con un esempio:
e` stilisticamente e concretamente superiore, invece di:
class pippo {
    // ...
public:
    friend ostream& operator<<(ostream& o, const pippo& p)'
};
avere il seguente arrangiamento:
class pippo {
    // ...
public:
    ostream& emit(ostream& o) const;
};
inline     // pura e semplice "veste sintattica", quindi inline
ostream& operator<<(ostream& o, const pippo& p) {
    return p.emit(o);
}
In questo modo, non vi e` alcuna necessita` che
l'inserter (che per ragioni sintattiche non puo` essere
funzione membro della class pippo) sia friend di pippo;
il ruolo dell'inserter, infatti, si riduce, in questo modo,
a quello di un semplice "guscio sintattico" di comodo,
e tutta la sua vera funzionalita` e` fornita invece dalla
funzione-membro emit.
Fra gli svariati vantaggi, questo dovrebbe anche
permetterti, senza fatica, di aggirare le limitazioni
che il tuo compilatore sembra avere sui template
(resta comunque consigliabile, se appena puoi,
aggiornare la versione del compilatore, ovviamente).
Alex

Nessuno sa dirmi dove posso trovaretutte le interruzioni, le chiamte al
BIOS!!! del Linguaggio Assembly!?!
ara...@italymail.com

...


BIOS!!! del Linguaggio Assembly!?!
Ci sono le liste di Ralph Brown, all'indirizzo
http://www.cs.cmu.edu/afs/cs.cmu.edu/usr/ralf/pub/WWW/files.html
Puoi anche convertirle nel formato delle Norton Guides, per
consultazioni rapide.
-- 
Gargamella alias Massimo Lauria
"Non e` bello cio` che e` bello, ma e` bello cio` che piace... a me!"
remove *dinkyisland* from address to mail me
------------> 
http://www.netonline.it/
 <------------