Newsgroup: it.comp.lang.c++
Titolo: cosa è typename?

come da oggetto...
-- 
]\/[ad]\/[age (
www.mindreamz.net
)
"Un Maestro insegue semplicemente la sua visione di Eccellenza in
qualunque cosa sta facendo e lascia agli altri decidere se sta 
lavorando o giocando. A lui sembra sempre di fare entrambe." - Anonimo


La parola riservata "typename" è stata introdotta nello Standard C++ del
1998 ed ha lo stesso significato della parola "class" nella definizione di
template.
Inoltre viene utilizzata anche per il parsing dei membri nei template.
--------------------------------
Inviato via 
http://usenet.libero.it

 come da oggetto...
Una keyword del linguaggio ;-)
Ciao,
Nicola

Inoltre viene utilizzata anche per il parsing dei membri nei template.
cioè?


 introdotta?
Perchè semanticamente più corretta in quel contesto: i template non sono
funzioni ma sono piuttosto ricette per costruire funzioni: un typename è un
ingrediente mentre una classe è solo un particolare ingrediente.
spero che la metafora gastronomica sia chiara
Ciao
Antonio


sě, abbastanza chiaro... ma non hai risposto se i due termini sono
intercambiabili... cioč č semplicemente una differenza sintattica (una
keyword aggiunta per sottolineare la semantica piů esatta), oppure le
due keyword hanno differenze piů profonde...
ad esempio, posso scrivere
typename Pippo {
public:
private:
};
???


 due keyword hanno differenze più profonde...
mi sembra che le risposte che ti hanno dato non siano molto chiare
(e non perche' io sia un guru in materia, ma anzi perche' sono un
beginner del C++ e, dopo questo thread, ho dovuto prendere in mano lo
stroustrup :)). 
Riportando direttamente uno stralcio del testo sacro:
  [...]
  template<class C> void f4(C& v)
  {
    C::iterator i = v.begin();  // errore
    // ...
  }
  Sfortunatamente, al compilatore non e' richiesto di essere
  preveggente, per cui non puo' sapere che C::iterator e' il nome di un
  tipo.
In sostanza nell'esempio di cui sopra C e' una classe passata come
parametro ad un template, ed il compilatore non ha modo di sapere che
il membro C::iterator e' un tipo piuttosto che una variabile o una
funzione...
Per farglielo capire usi typename. La versione corretta e' quindi:
  template<class C> void f4(C& v)
  {
     typename C::iterator i = v.begin();
     // ...
  }
Per quanto riguarda la sua equivalenza con 'class' in alcuni
particolari contesti, direi che e' solo un "effetto collaterale" di
scarsa importanza. Sempre citando lo stroustrup:
  La parola chiave typename puo' essere preposta a un nome qualificato
  per indicare che l'entita' a cui ci si riferisce con quel nome e' un
  tipo. In questo, typename assomiglia a struct e class. La parola
  chiave typename puo' anche essere utilizzata come un'alternativa alla
  parola chiave class nelle dichiarazioni di template. Per esempio:
    template<typename T> void f(T);
  L'autore, non essendo un gran dattilografo ed essendo sempre a corto
  di spazio sullo schermo, preferisce la forma piu' compatta:
    template<class T> void f(T);
spero di essere stato d'aiuto :)
-- 
There are only 10 kinds of people in the world --
Those who understand binary, and those who don't.

spero di essere stato d'aiuto :)
chiarissimo, finalmente... dunque sono sinonimi nella dichiarazione di
una classe (gli ultimi due esempi), mentre indicano cose diverse
altrove, dico bene?
tu dici che se non si usa typename C::iterator il compilatore non sa
cosa ha davanti... ma come potrebbe essere una funzione o una
variabile con una dichiarazione del tipo
C::iterator i = v.begin();
??
