Tipo no encontrado cuando se deriva de la clase base de plantilla

Tengo dificultades para entender por qué hay una diferencia en las siguientes dos piezas de código, qué hace exactamente el compilador.

Tengo el siguiente código trivial, que se compila sin ningún problema como se esperaba:

class base
{
public:
   typedef int booboo;
};

class derived : public base
{
public:
   int boo()
   {
      booboo bb = 1;
      return bb;
   }
};

int main()
{
   derived d;
   d.boo();
   return 0;
}

Tomo el código de arriba y agrego algunos parámetros de plantilla, y comienzo a obtener errores relacionados con el tipo booboo que no son válidos:

template <typename T>
class base
{
public:
   typedef T booboo;
};

template <typename T>
class derived : public base<T>
{
public:
   //typedef typename base<T>::booboo booboo; <-- fixes the problem
   booboo boo()
   {
      booboo bb = T(1);
      return bb;
   }
};

int main()
{
   derived<int> d;
   d.boo();
   return 0;
}

Error:

prog.cpp:13:4: error: ‘booboo’ does not name a type
prog.cpp:13:4: note: (perhaps ‘typename base<T>::booboo’ was intended)
prog.cpp: In function ‘int main()’:
prog.cpp:23:6: error: ‘class derived<int>’ has no member named ‘boo’

http://ideone.com/jGKYIC

.

Me gustaría comprender en detalle cómo un compilador de c ++ típico compila la versión de la plantilla del código, cómo difiere de compilar el ejemplo original, es un problema relacionado con varias pasadas del código y el aspecto dependiente del tipo. ¿UPS?

Respuestas a la pregunta(1)

Su respuesta a la pregunta