调用模板函数的问题"No matching function for call"参数:迭代器、对象函数



我正在学习面向对象课程的考试,我有一个关于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();
}

我从主要称呼它,就像这样:

swapElementsIf(v1.begin(),v1.end(),l1.begin(),l1.end(),std::less<double>());

std::vector::begin()返回一个临时对象(r值),临时不能传递给接受引用(l值)的函数。

始终查看完整的编译器错误输出,因为它通常包含现代编译器的提示。 例如,叮当打印:

<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)

迭代器通常基本上只是一个指针,因此复制起来很便宜,因此无论如何使用引用都没有好处。

最新更新