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

时间:2011-12-22 23:44:16

标签: c++ iterator

我在使用下面的泛型函数时遇到了一些困难,我希望这个函数能够获取2个迭代器和一个值。该函数应在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;
}

这是考试问题的一部分:

  

写一个通用函数计数:

     
      
  • 将容器的值和两个迭代器作为参数(从和开始的位置)   在容器中完成的地方)。

  •   
  • 它使用迭代器遍历容器的元素并计算发生的事件 -   容器中的价值。

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

  •   

两个迭代器不一定与con返回的迭代器相同 tainer的begin()和end()方法!

2 个答案:

答案 0 :(得分:4)

首先,您传递9(类型为int),这就是Container推断出来的内容。由于int没有嵌套的typedef iteratorSFINAE会启动。这会从重载集中删除该函数,并且因为您没有其他可以选择的函数,所以没有要调用的函数:错误。

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

答案 1 :(得分:2)

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;
     }
 }