作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习面向对象类(class)的考试,我有一个关于 STL 的经验,包括库算法、迭代器等。我正在尝试发送给函数迭代器和对象函数,但它没有工作。编译器说“没有匹配的调用函数”
我在这里搜索了其他人的解决方案,并修复了一些问题(r 值类型),但仍然不知道问题出在哪里。我找到的解决方案都没有解决它。
这是具体的功能:
template <class IT1, class IT2, class FUNC>
void swapElementsIf(IT1& begin1, IT1& end1, IT2& begin2, IT2& end2, FUNC f) {
if ((begin1 == end1) || (begin2 == end2))
throw EmptyExp();
while (begin1 != end1 && begin2 != end2) {
if (f(*begin1, *begin2))
std::swap(*begin1, *begin2);
begin1++;
begin2++;
}
if (((begin1 == end1) && (begin2 != end2)) || ((begin1 != end1) && (begin2 == end2)))
throw NotSameSizeExp();
}
我从 main 调用它,就像这样:
swapElementsIf(v1.begin(),v1.end(),l1.begin(),l1.end(),std::less<double>());
最佳答案
std::vector::begin()
返回临时对象(右值),临时对象不能传递给采用引用(左值)的函数。
始终查看完整的编译器错误输出,因为它通常包含现代编译器的提示。例如。铿锵打印:
<source>:26:5: error: no matching function for call to 'swapElementsIf'
swapElementsIf(v1.begin(),v1.end(),l1.begin(),l1.end(),std::less<double>());
^~~~~~~~~~~~~~
<source>:9:6: note: candidate function [with IT1 = __gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > >, IT2 = __gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > >, FUNC = std::less<double>] not viable: expects an l-value for 1st argument
void swapElementsIf(IT1& begin1, IT1& end1, IT2& begin2, IT2& end2, FUNC f) {
^
更改您的函数以按值获取迭代器:
void swapElementsIf(IT1 begin1, IT1 end1, IT2 begin2, IT2 end2, FUNC f)
迭代器通常基本上只是一个指针,因此复制起来很便宜,因此无论如何使用引用都没有任何好处。
关于c++ - 调用模板函数问题 "No matching function for call"arguments : iterators, object function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57614599/
我是一名优秀的程序员,十分优秀!