Question

Ce qui suit ne peut pas compiler (avec gcc 4.2.1 sur Linux, de toute façon):

template< typename T >
class Foo
{
public:
   typedef int FooType;
};

void
ordinary()
{
   Foo< int >::FooType bar = 0;
}

template< typename T >
void
templated()
{
   Foo< T >::FooType bar = T( 0 );
}

int main( int argc, char **argv )
{
   return 0;
}

Le problème est avec cette ligne:

   Foo< T >::FooType bar = 0;

... et le compilateur fait cette plainte:

  

foo.c: En fonction «vide sur matrice ():

     

foo.c: 22: erreur: attendu '; » avant « bar »

Normalement, on voit quand un type n'a pas été déclarée, mais pour autant que je peux dire, Foo :: FooType doit être parfaitement valide dans templated ().

Était-ce utile?

La solution

Utilisation typename:

  typename Foo< T >::FooType bar = 0;

Voir ce pourquoi typename est nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top