std :: find有两种不同的类型

时间:2017-06-13 07:11:31

标签: c++ c++11 stl operator-overloading

我正在尝试使用两种不同类型的std :: find,但提供必要的布尔运算符。

class FooDetails
{
public:
    FooDetails(int size = 5)
    : m_size(size) { /* empty */ }
    bool operator<(const FooDetails& other) const { return m_size < other.m_size; }
    bool operator==(const FooDetails& other) const { return m_size == other.m_size; }
private:
    int m_size;
};

class Foo
{
public:
    Foo(int size)
    : m_details(size) { /* empty */}

    bool operator==(const Foo& other) const { return m_details == other.m_details; }
    bool operator==(const FooDetails& other) const {return m_details == other; }
    bool operator<(const Foo& other) const { return m_details < other.m_details; }
    bool operator<(const FooDetails& other) const { return m_details < other; }
    FooDetails m_details;
};

bool operator==(const FooDetails& lhs, const Foo& rhs) { return lhs == rhs.m_details; }
bool operator==(const Foo& lhs, const FooDetails& rhs) {return lhs.m_details == rhs; }
bool operator<(const FooDetails& lhs, const Foo& rhs) { return lhs < rhs.m_details; }
bool operator<(const Foo& lhs, const FooDetails& rhs) { return lhs.m_details < rhs; }

int main() {
    std::vector<Foo> haystack = { FooDetails(5), FooDetails(6), FooDetails(7) };

    FooDetails needle(6);
    std::find(haystack.begin(), haystack.end(), needle);
    return 0;
}

由于std :: find使用operator ==我希望这可以工作,因为提供了所有必需的功能。但是这不会编译。为什么这样,我该如何解决? 我知道我可以使用std :: find_if,但我认为它有点慢,即使它不是我想知道为什么std :: find不起作用。

2 个答案:

答案 0 :(得分:4)

我已将您的代码更改为:

#include <algorithm>

class FooDetails
{
public:
    FooDetails(int size = 5)
    : m_size(size) { /* empty */ }
    bool operator<(const FooDetails& other) const { return m_size < other.m_size; }
    bool operator==(const FooDetails& other) const { return m_size == other.m_size; }
private:
    int m_size;
};

class Foo
{
public:
    Foo(int size)
    : m_details(size) { /* empty */}

    FooDetails m_details;
};

bool operator==(const FooDetails& lhs, const Foo& rhs) { return lhs == rhs.m_details; }
bool operator==(const Foo& lhs, const FooDetails& rhs) {return lhs.m_details == rhs; }
bool operator<(const FooDetails& lhs, const Foo& rhs) { return lhs < rhs.m_details; }
bool operator<(const Foo& lhs, const FooDetails& rhs) { return lhs.m_details < rhs; }

int main() {
    std::vector<Foo> haystack = { Foo(5), Foo(6), Foo(7) };

    FooDetails needle(6);
    std::find(haystack.begin(), haystack.end(), needle);
    return 0;
}

它成功编译。您的原始版本包含两个错误:

  1. 您尝试使用std::vector<Foo>创建std::initialization_list<FooDetails>初始值。
  2. 您提供了太多比较运算符:免费版本和Foo结构的成员。所以在查找期间,编译器抱怨它不知道选择哪一个。你应该只留下其中一个。

答案 1 :(得分:1)

Foo类中没有这样的构造函数,它从FooDetails构造它。您需要定义以下内容,您的代码才能正常工作:

Foo(const FooDetails& d) : m_details(d) {}