Spiegato l'arcano.
Quando si intende utilizzare un tipo definito internamente a un template occorre precederlo col qualificatore
typename. In caso contrario il compilatore non sa se ha a che fare con un tipo di variabile o una variabile.
Nota che vale solo se il tipo del template è ignoto.
Per capirsi: vector<int>::const_iterator p1; non avrebbe dato errori.
template<class T>
void printVector(const vector<T> &vec) {
typename vector<T>::const_iterator p1;
for(p1=vec.begin();p1!=vec.end();++p1){
cout<<*p1<<' ';
}
}