求教关于C++函数模板的解释解决方法

求教关于C++函数模板的解释
程序很简单,就是一个打印函数,目的是打印所有类型的vector,比如vector<int>, vector<string>等。
开始的程序是这样的:

template <typename T>
void printVec(vector<T> vec){
     for(vector<T>::iterator vit = vec.begin(); vit != vec.end(); ++vit){
          cout << (*vit) << '\t';
     }
     cout << endl;
}
错误提示是:依赖名'std::vector<T>::iterator'被解析为非类型,而实例化时却产生了一个类型
          如果您想指定类型,请使用'typename std::vector<T>::iterator'
后来使用vector<T>::size_type也不行,最后是改成如下形式了:
template <typename T>
void printVec(vector<T> vec){
     unsigned int len = vec.size();
     for(int i=0; i<len; ++i){
          cout << vec.at(i) << '\t';
     }
     cout << endl;
}

哪位大牛了解vector的内部实现,能给解释下这个现象?
这是在linux下编的。
c++ 模板 内部实现

------解决方案--------------------
for(typename vector<T〉::iterator .....)应该就可以了

------解决方案--------------------
在模板中使用其他模板的时候,因为不知道引用的名字是静态变量还是typedef 需要用typename关键字帮帮编译器
------解决方案--------------------
在模版的实现中,要用到实例类型中定义的类型,必须要显式指明。
即使用 typename std::vector<T>::iterator 告诉编译器,这是个类型,不是成员。
同理,size_type也是一样。
要知道:std::vector不是类型,也没有这个类型;std::vector<T> 才是一种类型,是以T类型为模版形参生成的一个类。
然后这么想一下:
std::vector<T>::iterator
std::vector<T>::size_type
因为模板是编译根据实例化来生成函数和类的,所以在编译时候,模版不知道上述两句话中,iterator和siz_type是vector<T>这个类的成员还是vector<T>类中声明的类型。虽然你知道都是类型,但是编译器的生成代码的时候不知道。