Nie znaleziono typu, jeśli pochodzi z klasy bazowej szablonu

Mam trudności ze zrozumieniem, dlaczego istnieje różnica w dwóch następnych fragmentach kodu, co dokładnie robi kompilator.

Mam następujący bit trywialnego kodu, który kompiluje się bez żadnych problemów zgodnie z oczekiwaniami:

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

Biorę kod z powyższego i dodaję kilka parametrów szablonu i zaczynam otrzymywać błędy dotyczące tego, że typ booboo nie jest prawidłowy:

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

Błąd:

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

.

Chciałbym zrozumieć szczegółowo, w jaki sposób typowy kompilator c ++ zajmuje się kompilowaniem wersji szablonu kodu, czym różni się od kompilowania oryginalnego przykładu, czy jest to problem związany z wieloma przebiegami kodu i wyglądem zależnym od typu UPS?

questionAnswers(1)

yourAnswerToTheQuestion