Plantillas anidadas con scope dependiente

¿Qué es el scope dependiente y cuál es el significado de typename en el contexto del siguiente error?

$ make g++ -std=gnu++0x main.cpp main.cpp:18:10: error: need 'typename' before 'ptrModel<std::vector >::Type' because 'ptrModel<std::vector >' is a dependent scope make: *** [all] Error 1 /* * main.cpp */ #include  #include  template struct ptrModel { typedef std::unique_ptr Type; }; template struct ptrType { typedef ptrModel< std::vector >::Type Type; }; int main() { return 0; } 

El comstackdor te dijo exactamente qué hacer. Escriba typename antes de ptrModel >::Type , como tal:

  typedef typename ptrModel >::Type Type; 

La razón de este requisito es que el comstackdor no sabe en este momento si ptrModel >::Type describe una variable miembro o un tipo nested. Ni siquiera puede darse cuenta de ello mirando la definición de ptrModel porque podría haber una especialización de ptrModel para std::vector algún otro lugar del progtwig que aún no ha llegado y que cambie cuál de estas cosas ::Type refiere a. Entonces debes decirlo explícitamente.

El nombre ptrModel >::Type tiene un “scope dependiente” porque está en un ámbito que depende de la instanciación de una plantilla.