【问题标题】:No matching function for call to for a generic function通用函数的调用没有匹配的函数
【发布时间】:2012-01-26 12:16:57
【问题描述】:

我在使用下面的通用函数时遇到了一些困难,我希望这个函数采用 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() 方法!

【问题讨论】:

    标签: c++ iterator


    【解决方案1】:

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

    为什么?因为您不能将引用绑定到右值表达式,begin()end() 是。此外,这样做没有多大意义,因为迭代器非常小,而且按值复制速度更快。

    2) 使用迭代器类型,而不是容器。

    9 不是容器,因此缺少迭代器类型。没有理由需要容器,因为迭代器被设计为在没有它们的情况下工作。一些迭代器甚至没有容器,例如普通的 ol 指针。如果您想指定迭代器的类型,您始终可以将您的函数称为count_c&lt;foo::iterator&gt;(...)

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

    【讨论】:

    • 别忘了初始化count
    【解决方案2】:

    首先,您传递9(其类型为int),这就是Container 的推论。由于int 没有嵌套的typedef iteratorSFINAE 开始起作用。这会从重载集中删除该函数,并且由于您没有其他可以选择的函数,因此您没有可以调用的函数: 错误。

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

    【讨论】:

    • 感谢您的提示,不过还有一个问题。我将 myv.begin()、myv.end() 作为参数传递。但是我怎样才能让我的迭代器指向向量中的任何元素呢?
    • @cody:如果您的意思是要将其指向某个索引,则可以:iterator it_at_index = myv.begin() + index;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 2021-09-21
    • 2016-11-23
    • 2016-08-08
    • 2014-03-12
    • 2015-03-17
    • 2018-08-04
    相关资源
    最近更新 更多