我想编写一个可以处理set,list,map,vector等的C ++泛型算法......所以这个算法接受一个容器和一个函数对象,所以我可以检查某些条件。
该算法需要根据一定条件检查容器中最长的序列并返回其长度。
我在将函数对象传递给函数时遇到了麻烦,因为我得到了这个错误(在main的第二行):
“此行的多个标记 - 无效的参数'候选者是:void functionA(#0&,#0&,#1)' - 无效初始化'int *&'类型的非const引用来自'std :: array :: iterator {aka“
类型的右值
我不明白这个问题,因为函数对象中有一个operator():\即使我先调用构造函数,我仍然会收到此错误..
我尝试了什么:template<typename T,typename Predicate>
void functionA(T& it1 , T& end1,Predicate pred){
for(;it1 != end1; ++it1){
T it2=it1++;
if(!pred(*it1,*it2)){
std::cout << *it1 << "\n" ;
return;
}
}
std::cout <<"not found" << "\n" ;
}
class FindFirst {
public:
FindFirst();
bool operator()(int f , int s) const {
return f < s;
}
};
int main() {
std::array<int,11> myarray = {1,2,4,7,10,14,3,6,12,24,48};
functionA(myarray.begin(),myarray.end(),find);
}
答案 0 :(得分:2)
问题是std::array::begin按值返回,这是一个临时的,不能绑定到非const的左值引用(即T&
)。
将functionA
的参数类型更改为按值传递,例如
template<typename T,typename Predicate>
void functionA(T it1 , T end1,Predicate pred){