std::iterator_traits
can help you determine the value type given an iterator type.
template<typename forwardIterator>
void bucketSort(forwardIterator begin, forwardIterator end) {
using T = typename std::iterator_traits<forwardIterator>::value_type;
std::vector<unsigned> bucketVec(std::numeric_limits<T>::max() + 1, 0);
for (auto it = begin; it != end; it++)
bucketVec[*it]++;
auto it = begin;
for (unsigned j = 0; j < bucketVec.size(); j++)
for (unsigned k = 0; k < bucketVec[j]; k++)
*it++ = j;
}