对泛型函数的调用没有匹配的函数
No matching function for call to for a generic function
我在使用下面的泛型函数时遇到了一些困难,我希望这个函数接受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;
}
}
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- C++ 如何重载 [] 运算符并进行函数调用
- 代码的效率. 转到和函数调用
- 是同一作用域的函数部分中的函数调用
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 类型擦除的std::function与虚拟函数调用的开销