¿Por qué falla la deducción del tipo iterador? [duplicar]

Esta pregunta ya tiene una respuesta aquí:

¿Por qué no se puede deducir el argumento de la plantilla cuando se utiliza como parámetro de plantilla a otra plantilla? 4 respuestas

¿Por qué esto no funciona en C ++?
Porque no puedo restringirfooel parámetro astd::vector<T>::iterator Así, y ¿cuál es la mejor solución?

#include <vector>

template<class T>
void foo(typename std::vector<T>::iterator) { }

int main()
{
    std::vector<int> v;
    foo(v.end());
}

El error es:

In function ‘int main()’:
     error: no matching function for call to ‘foo(std::vector<int>::iterator)’
     note: candidate is:
    note: template<class T> void foo(typename std::vector<T>::iterator)
    note:   template argument deduction/substitution failed:
     note:   couldn’t deduce template parameter ‘T’

Respuestas a la pregunta(2)

Su respuesta a la pregunta