#include <vector>
#include <array>
template <typename T > 
struct Foo {
    typedef typename std::vector<T>::iterator Iterator;

    inline void bar( const Iterator& it ) const;

    std::vector<T> vec;
};

// Compiles fine without "typename"...
template <typename T>
inline void Foo<T>::bar( const typename Foo<T>::Iterator& it ) const {}

int main() {
    Foo<float> f;
    f.bar( f.vec.begin() );
    return 0;
}