В синтаксисе:
typename T::template identifier<Index>::type
ключевое слово typename
не говорит, что T
является типом - оно говорит, что все T::template identifier<Index>::type
является типом. Когда он не вводит параметр шаблона, typename
всегда предшествует qual-id , что-то, что содержит хотя бы один токен ::
, например A::B::C
, и говорит, что фамилия в этой цепочке имен и ::
токены именуют тип.
С другой стороны, использование ключевого слова template
для указания того, что имя элемента называет шаблон, всегда следует после ::
или .
или ->
и непосредственно перед именем, которое является шаблоном.
Итак, в этом примере допустимой грамматикой является T::template identifier<Index>::template type
, но это не имеет смысла вместе с предыдущим typename
и фактом что s
ожидает тип, а не шаблон в качестве аргумента шаблона.