I know very well why one needs to use typename
for dependent types, since the compiler may not be able to disambiguate between a type and a variable declaration whe
The template argument type T does not, and can not implicitly carry with it its internal components. thus T::type is fundamentally a new type when the compiler looks at the uninstantiated template, hence the need to declare a new typename 'T::type'.
Unfortunately, I think this issue will remain with us until the standard includes full-fledged Concepts.