我在使用下面的泛型函数时遇到了一些困难,我希望这个函数能够获取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()方法!
答案 0 :(得分:4)
首先,您传递9
(类型为int
),这就是Container
推断出来的内容。由于int
没有嵌套的typedef iterator
,SFINAE会启动。这会从重载集中删除该函数,并且因为您没有其他可以选择的函数,所以没有要调用的函数:错误。
由于这是考试准备,我只给出一个提示:对迭代器和值类型进行模板化,而不是容器类型。
答案 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;
}
}