编译C ++代码时可能导致No Match Call错误的原因是什么?

时间:2014-07-30 08:10:39

标签: c++ eclipse c++11 lambda

编译这段代码时收到错误:

void Lift::AddDestFloors(const vector<Person>& persons,
                         vector<int>& fplan,
                         int lift_pos) {
    for (auto &person : persons) {
        int dest_flr = person.dest_floor;
        if (std::find_if(fplan.begin(), fplan.end(),
                         [dest_flr] (const Person& person) -> bool {
                             return person.dest_floor == dest_flr;
                         }) == fplan.end()) {
            InsertToMasterFlightPlan(person.dest_floor, fplan);
        }
    }
}

错误讯息:

no match for call to '(Lift::AddDestFloors(const std::vector&,
std::vector&, int)::__lambda0) (int&)'
LiftSim     line 208, external location: 
c:\mingw\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_algo.h  C/C++ Problem

我的环境是:

  • Windows 7,
  • Eclipse(开普勒)
  • Mingw 4.8.1

为什么我会收到此错误?

1 个答案:

答案 0 :(得分:3)

错误意味着使用(Lift::AddDestFloors(const std::vector&, std::vector&, int)::__lambda0)作为参数调用某些类型int的值,但不能使用int值调用该对象。 (例如,如果您的lambda采用bool,则无法使用int作为参数调用它。

代码中唯一的lambda是find_if的参数:[dest_flr](const Person& person)->bool {return person.dest_floor == dest_flr;})

您在find_if上致电fplanfplan的元素类型为int,因此lambda也应该采用int,而不是Person