Использование typedefs из класса шаблона в функции шаблона (не члена)

Следующее не скомпилируется (в любом случае с gcc 4.2.1 в Linux):

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;
}

Проблема в этой строке:

   Foo< T >::FooType bar = 0;

... и компилятор делает эту жалобу:

foo.c: В функции 'void templated()':

foo.c: 22: ошибка: ожидается `;' перед "бар"

Обычно это можно увидеть, когда тип еще не объявлен, но, насколько я могу судить, Foo::FooType должен быть полностью допустимым внутри templated().

1 ответ

Решение

Использование typename:

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

Посмотрите, почему Typename необходимо.

Другие вопросы по тегам