错误C2672:'operator __surrogate_func':使用std :: upper_bound时找不到匹配的重载函数

时间:2016-10-09 05:38:58

标签: c++ c++11 visual-c++

考虑以下计划

struct slot {
    int item;
    bool operator<(const int& right) const {
        return item < right;
    }
    slot(int item) : item(item) {}
};
int main() {
    std::vector<slot> rails;
    std::lower_bound(cbegin(rails), cend(rails), 5);
    std::upper_bound(cbegin(rails), cend(rails), 5);
}

我使用std :: upper_bound来二进制搜索向量,但在编译时失败

c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(2609): error C2672: 'operator __surrogate_func': no matching overloaded function found

考虑到std::upperbound使用operator<进行隐式比较而不使用谓词的事实,我找不到编译器抱怨的正当理由。此外,错误消息不是很有意义,因为我没有看到在这里使用代理函数的原因。即使是使用仿函数less<>的情况,也不应该是问题,因为slot与整数的可比性较低。值得注意的是std::lower_bound具有可接受的语法。

参考:http://rextester.com/WKK72283

2 个答案:

答案 0 :(得分:2)

std::upper_bound的规范清楚地说明时,它应用与左侧的参数值和右侧的序列元素的比较。即在你的情况下,这将是int < slot比较。您的operator <不支持按特定顺序排列的比较。

对于std::upper_bound,您需要

bool operator <(int left, const slot &s)
{
  return left < s.item;
}

,不能作为成员函数实现。

同时,std::lower_bound将比较应用于右侧的参数值,即slot < int比较。

您的原始实施适用于std::lower_bound,但不适用于std::upper_bound

答案 1 :(得分:0)

正如上面的回答所建议的,如果可以实现operator <来获取2个参数,那么你的问题就可以得到解决,但这与成员函数实现相矛盾。但是如果这成为friend函数会怎么样呢。事实证明,上述问题可以通过将其声明为朋友函数来解决。

所以你的代码看起来与此类似:

struct slot {
    int item;

    friend bool operator<(int left, const slot &s)
    {
        return left < s.item;
    }

    friend bool operator<(const slot &s, int left)
    {
        return s.item < left;
    }

    slot(int item) : item(item) {}
};