Newsgroup: it.comp.lang.c++
Titolo: template typedef ereditati

Scusate se rompo ancora, ma non riesco a capire come aggirare il seguente
problema col compilatore borland:
template <typename T>
struct base{
  typedef T type;
};
template <typename T>
struct derived:public base<T>{
  type t;
};
nel main metto per esempio derived<int> d;
Ebbene, il codice sopra compila con vc6 , compila (con warning dovuti al
typename implicito (*) ) con gcc 3.2 ,
NON compila col compilatore del bcb5 (credo sia il borland 5.5). Mi dice:
[C++ Error] Unit1.cpp(15): E2303 Type name expected
[C++ Error] Unit1.cpp(15): E2139 Declaration missing ;
E' un bug del compilatore ? C'č un modo di aggirare il problema ? Grazie in
anticipo!
(*) : per accontentare il gcc ho provato in tutte le forme e combinazioni a
inserire la keyword "typename", e anche "template" , ma facendo cosė... non
compila proprio pių! mha...
--
imho

NON compila col compilatore del bcb5 (credo sia il borland 5.5). Mi dice:
template<typename T>
struct base
{ typedef T type; };
template<typename T>
struct derived : public base<T>
{ typename base<T>::type t; };
int main()
{ derived<int> d; }
sbirish.

 { derived<int> d; }
Grazie. Sě, lo so che cosě funziona, ma perché dovrei ridefinire in una
classe derivata un tipo che ho giŕ definito nella classe base ? (tra l'altro
se non intervengono i template funziona). Nel caso di classi template non si
ereditano i typedef ? Ciň che mi piacerebbe sapere č quale sarebbe il
comportamento definito dallo standard nel caso da me citato.
--
imho

comportamento definito dallo standard nel caso da me citato.
<cite from="14.6.2 [temp.res]">
 A name used in a template declaration or definition and that is 
 dependent on a templateparameter is assumed not to name a type unless
 the applicable name lookup finds a type name or the name is qualified
 by the keyword typename.
</cite>
lo standard vuole che sia espressamente usato typename nel tuo caso,
ne consegue che sia gcc che il compilatore borland abbiano un
comportamento lecito dandoti un warning/rifiutandosi di compilare.
sbirish.

 sarebbe il comportamento definito dallo standard nel caso da me citato.
non e` questione di "ridefinire il tipo": se noti sbirish ha usato
"typename" e *non* "typedef".
Dato che la classe base dipende dal parametro del template il compilatore
non la conosce sino a che non la istanzia - questo significa che il parser
*non* sa che 'type' corrisponde a un tipo: per quel che ne sa lui potrebbe
essere qualsiasi cosa, come ad esempio il nome di una funzione; per far si
che il parser sappia che 'type' e` un tipo devi dirglielo esplicitamente e
'typename' serve proprio a questo.
ciao Anto
-- 
"Computer science is not about computers any more than astronomy
is about telescopes." -- EW Dijkstra

 ciao Anto
--
imho

 con parametro T !
Non è detto che, al momento dell'instanziazione di una particolare
derived<T>, questa risulti di fatto derivata proprio da un'instanziazione di
quella base<> che avevi appena definito. In quella fase, potrebbe infatti
entrare in gioco un'eventuale specializzazione (parziale o non) di base<>.
Il compilatore non può perciò contare sulla sua conoscenza di base<>.
Max

"Max M." ha scritto:

Perfetto, mi pare di aver capito il meccanismo. Grazie mille!
--
imho