Typ nicht gefunden, wenn er von der Basisklasse der Vorlage abgeleitet wurde

Ich habe Schwierigkeiten zu verstehen, warum es bei den folgenden beiden Codeteilen einen Unterschied gibt, was genau der Compiler tut.

Ich habe das folgende Stück Trivialcode, das sich erwartungsgemäß ohne Probleme kompilieren lässt:

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

Ich nehme den Code von oben und füge einige Template-Parameter hinzu und beginne Fehler zu bekommen, die den Typ booboo betreffen, der nicht gültig ist:

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

.

Ich möchte im Detail verstehen, wie ein typischer C ++ - Compiler die Template-Version des Codes kompiliert, wie er sich von der Kompilierung des ursprünglichen Beispiels unterscheidet. UPS?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage