Нет подходящей функции для вызова общей функции - PullRequest
2 голосов
/ 23 декабря 2011

У меня возникли некоторые трудности с нижеприведенной обобщенной функцией, я хочу, чтобы эта функция принимала 2 итератора и значение. Функция должна выполнять итерацию между двумя итераторами, проверять наличие вхождений значения и подсчитывать вхождения. Но я получаю следующую ошибку:

нет соответствующей функции для вызова функции count_c (int, std :: vector :: iterator, std :: vector :: iterator) '

 template<typename Container>
 int count_c(Container i, typename Container::iterator &start, typename Container::iterator &end){
     typedef typename Container::iterator Iter;
     int count;
     for(Iter p = start; p != end; p++){
       if((*p) == i){
       count = count + 1;
     }
     return count;
 }


int main(){
  vector<double> myv;
  myv.push_back(9);
  myv.push_back(10);
  count_c(9, myv.begin(), myv.end());
  return 0;
}

Это часть экзаменационного вопроса:

Напишите общее число функций, которое:

  • Принимает в качестве параметров значение и два итератора контейнера (с чего начать и где закончить в контейнере).

  • Он использует итераторы для прохождения элементов контейнера и подсчета стоимость в контейнере.

  • Наконец, он возвращает количество вхождений найденного значения.

Два итератора не обязательно совпадают с тем, что возвращается методы tainer begin () и end ()!

Ответы [ 2 ]

4 голосов
/ 23 декабря 2011

Сначала вы передаете 9 (который имеет тип int), и это то, что Container выводится как.Так как int не имеет вложенной typedef iterator, SFINAE запускается. Это удаляет функцию из набора перегрузки, и так как у вас нет другой функции, которую можно выбрать, вы получаетенет функций для вызова: ошибка.

Поскольку это для подготовки к экзамену, я дам только подсказку: Templatize для итераторов и типа значения, а не типа контейнера.

2 голосов
/ 23 декабря 2011

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;
     }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...