When you use a template with different template arguments the generated classes are not in any sense the same. So std::array<int, 1> and std::array<int, 2 are not the same type. When you instantiate the template a specialised copy of the class is created thus the above example creates two distinct specialisations of std::array one with the arguments <int, 1> and one with <int, 2>. Even though the specialisations have very similar implementation they are not the same. As a consequence of this std::array<int, 1>::iterator is not the same type as std::array<int, 2>::iterator. They are two different specialisations.
Your attempt with std::array<int>, which seems pretty logical at first glance, is not correct because std::array expects two template arguments and not one. The auto keyword was introduced in part to make these kinds of things easier, use it.
PS: Thanks to aaronman for clarifying the answer.
array<int>to bestd::arraytakes two template params