Вопрос на самом деле не в typedef, а в typename.
Всякий раз, когда компилятор встречает имя, которое зависит от шаблона (в основном, все, что использует ::
после шаблона, он не может определить, является ли это тип или значение (это может быть, например, статическое int ), так что нужна подсказка.
Когда вы добавляете typename
, вы указываете, что зависимый член на самом деле является типом.
В вашем примере с typedef у вас все еще есть typename в объявлении typedef, но после объявления typedef это имя не является зависимым. Это просто тип, поэтому typename
не требуется при обращении к typedef.
По сути, компилятор не может быть уверен, что std::vector<CFoo<T>>::iterator
является типом.
Но он знает, что FooVIter
это тип, потому что это typedef. Typedefs всегда являются типами.