/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
typename og gcc 3.2
Fra : Ole Hyldahl Hansen


Dato : 02-12-02 21:11

Hej,

Følgende lille programstump compiler fint med GCC 2.96:

1   template <class A>
2   class Base {
3   public:
4      typedef int my_int;
5   };
6
7   template <class A>
8   class Deriv : public Base<A> {
9      void func(my_int my_var);
10   };
11
12   int main (int argc, char ** argv) {
13      return 0;
14   }


Compiler jeg med gcc 3.2 får jeg:
typedef.cpp:9: warning: `typename Deriv<A>::my_int' is implicitly a typename
typedef.cpp:9: warning: implicit typename is deprecated, please see the
documentation for details


Ok, fint nok at forsøge at overholde standarden. Men indsætter jeg
typename foran my_int således:
   void func(typename my_int my_var);

bliver gcc sur og siger:
typedef.cpp:9: parse error before `)' token

Hvordan er syntaksen så? Jeg kan omgå problemet ved at hive en
typedef typename Base<A>::my_int my_int;

ind i Deriv-klassen, men er det virkelig nødvendigt? Det skægge er, at
hvis jeg ikke lader Base og Deriv være templates opstår fejlen ikke.

Er der nogen, som kan kaste lidt lys over sagen?

Med venlig hilsen
Ole Hyldahl Hansen


 
 
Claus Rasmussen (02-12-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 02-12-02 21:52

Ole Hyldahl Hansen wrote:

> void func(typename my_int my_var);

Brug 'void func(typename Deriv<A>::my_int my_var)'.


> ind i Deriv-klassen, men er det virkelig nødvendigt?

Almindeligvis laver man en typedef i Deriv klassen i stedet:

template<typename A>
class Deriv : public Base<A> {
typedef typename Base<A>::my_int my_int;

...
};


> Det skægge er, at
> hvis jeg ikke lader Base og Deriv være templates opstår fejlen ikke.

typename bruges kun i templates. Derfor.

-Claus


Ole Hyldahl Hansen (02-12-2002)
Kommentar
Fra : Ole Hyldahl Hansen


Dato : 02-12-02 22:01

>>void func(typename my_int my_var);
> Brug 'void func(typename Deriv<A>::my_int my_var)'.


>
>>ind i Deriv-klassen, men er det virkelig nødvendigt?
>
>
> Almindeligvis laver man en typedef i Deriv klassen i stedet:
>
> template<typename A>
> class Deriv : public Base<A> {
> typedef typename Base<A>::my_int my_int;
>
> ...
> };

Jamen det må jeg jo gøre så. Jeg havde bare håbet, at det ikke var
nødvendigt at skrive den slags, da der er en del kode jeg skal have
checket og er ved at have skrivekrampe

>>Det skægge er, at
>>hvis jeg ikke lader Base og Deriv være templates opstår fejlen ikke.
>
>
> typename bruges kun i templates. Derfor.

Oh ja, så giver det mening igen.

Tak for svaret.

/Ole Hyldahl Hansen



Søg
Reklame
Statistik
Spørgsmål : 177491
Tips : 31966
Nyheder : 719565
Indlæg : 6408458
Brugere : 218886

Månedens bedste
Årets bedste
Sidste års bedste