Simple.
struct X {};
template<> class std::vector {
typedef std::vector::iterator iterator;
};
Oops.
Templates are Turing-Complete. You are asking the compiler to infer the arguments from the results. This is impossible in the general case, even ignoring the possibility of non-one-to-one correspondence.
Typically, you take the iterator type itself as template parameter. This permits other random-access iterators like deque, circular buffer, etc.