typename сообщает компилятору, что iterator_traits :: diff_type относится к типу class.
Рассмотрим более простой для понимания пример:
class ...
{
typename T::Something *p;
}
Без typename компилятор может попытаться создать stati c член, который будет содержать результат T :: Something, умноженный на p;
, в то время как при указании typename компилятор наверняка будет знать, что p является указателем типа T :: Something
Надеюсь, это поможет.