Почему я не могу пользоваться подклассом шаблонного класса, передаваемого в функцию с шаблонным шаблоном?

Я создал функцию printVector, выводящую содержимое любого вектора (если для них определён оператор << соответственно):

#include <iostream>
#include <vector>
using namespace std;

template<class templateType>
void printVector(vector<templateType>& container)
{
    for(vector<templateType>::iterator it = container.begin(); it != container.end() ; it++)
    {
        cout << *it<<" ";
    }
    cout << endl;
}


int main()
{
    vector<int> container = { 1,2,3 };
    printVector(container);
}

При определении шаблонного вектора в printVector я не могу создать объект его подкласса iterator:

vector<templateType>::iterator it; // ERROR

Данную проблему я решил, использовав auto:

#include <iostream>
#include <vector>
using namespace std;

template<class templateType>
void printVector(vector<templateType>& container)
{
    for(auto it = container.begin(); it != container.end() ; it++)
    {
        cout << *it<<" ";
    }
    cout << endl;
}


int main()
{
    vector<int> container = { 1,2,3 };
    printVector(container);
}

Но всё - же интересно, почему я не могу создать объект подкласса с помощью его имени (vector<templateType>::iterator), но при этом могу с помощью auto?


Ответы (1 шт):

Автор решения: Mikhailo

Потому что в

for(vector<templateType>::iterator it = container.begin(); 
    it != container.end() ; it++)
{

компилятор не знает, что iterator - это тип. Может, это статическая переменная?

Чтобы пояснить ему, что это тип, надо написать

for(typename vector<templateType>::iterator it = container.begin(); 
    it != container.end() ; it++)
{
→ Ссылка