Es necesario añadir nombretipo.
I.e.
template <typename T>
T invertible(T const& container, typename T::size_type startIndex, typename T::size_type endIndex);
Sin tener ninguna información sobre el tipo T, el compilador necesita saber que T :: size_type designa un tipo.
de la norma, la sección 14.6.2:
A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename
.
He leído ese pasaje, gracias (los que leen en casa pueden ver la explicación detallada en la página 130). Todavía no veo por qué se requiere "typename" en una declaración de argumento, ya que tiene que ser un tipo, pero tal vez sea solo por coherencia con los enunciados en general. –
@wnissen: Por lo general, tales requisitos existen para mantener felices a los constructores de analizadores. Parte del problema es que aparentemente ya sabes que es una declaración de argumento. Debido al problema de "analizar más molesto", el analizador generalmente tiene que deducirlo de los tokens entre(). Ahora, si dices que la interpretación de los tokens entre() debería depender de saber que es una declaración de argumento, entonces has introducido un problema de análisis cíclico. – MSalters