对泛型函数的调用没有匹配的函数

No matching function for call to for a generic function

本文关键字:函数 调用 泛型      更新时间:2023-10-16

我在使用下面的泛型函数时遇到了一些困难,我希望这个函数接受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;
}

这是考试问题的一部分:

写一个泛型函数count

  • 接受容器的一个值和两个迭代器作为形参(从哪里开始和从哪里开始)

  • 使用迭代器遍历容器中的元素,并对发生-计数

  • 最后,它返回它找到的值出现的次数。

这两个迭代器不一定与con-返回的结果相同Tainer的begin()和end()方法!

首先,您传递9(类型为int),这就是Container被推断为的。由于int没有嵌套的iterator类型定义,因此SFINAE开始发挥作用。这将从重载集中删除该函数,并且由于没有其他函数可以选择,因此没有函数可调用:

由于这是为考试做准备,我将只给出一个提示:模板化迭代器和值类型,而不是容器类型。

1)不要通过引用传递迭代器

为什么?因为不能将引用绑定到右值表达式,而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;
     }
 }