1) Не передавайте итераторы по ссылке.
Почему? Потому что вы не можете привязывать ссылки к выражениям rvalue, которые begin()
и end()
. Кроме того, в этом нет особого смысла, поскольку итераторы очень малы и быстрее копируют по значению.
2) Используйте тип итератора, а не контейнер.
9
не является контейнером, поэтому ему не хватает типа итератора. Нет необходимости в контейнере, поскольку итераторы были разработаны для работы без них. У некоторых итераторов даже нет контейнера, такого как обычные старые указатели. Вы всегда можете вызвать вашу функцию как count_c<foo::iterator>(...)
, если хотите указать тип итератора.
template<typename iter_t>
int count_c(int i, iter_t start, iter_t end){
int count = 0;
for(iter_t p = start; p != end; p++){
if((*p) == i){
count = count + 1;
}
}