尝试将 std::find 与自定义类型对象的向量一起使用(C2679,二进制“==”:无运算符,rhs,'const _Ty'),Visual Studio 15.9.25

Trying to use std::find with a vector of custom type objects (C2679, binary '==': no operator, rhs, 'const _Ty'), Visual Studio 15.9.25

亲爱的 Whosebug 社区,

类型 Couple 定义如下:

class Couple
{
public:
    Couple(Thing* aa, Thing* bb) : a(aa), b(bb) {};
public:
    bool operator == (const Couple& rhs) const { return this->a->unique_id == rhs.a->unique_id && this->b->unique_id == rhs.b->unique_id; }
    bool operator != (const Couple& rhs) const { return this->a->unique_id != rhs.a->unique_id || this->b->unique_id != rhs.b->unique_id; }
    bool operator <= (const Couple& rhs) const { return this->a->unique_id <  rhs.a->unique_id || this->a->unique_id == rhs.a->unique_id && this->b->unique_id <= rhs.b->unique_id; }
    bool operator >= (const Couple& rhs) const { return this->a->unique_id >  rhs.a->unique_id || this->a->unique_id == rhs.a->unique_id && this->b->unique_id >= rhs.b->unique_id; }
    bool operator <  (const Couple& rhs) const { return this->a->unique_id <  rhs.a->unique_id || this->a->unique_id == rhs.a->unique_id && this->b->unique_id <  rhs.b->unique_id; }
    bool operator >  (const Couple& rhs) const { return this->a->unique_id >  rhs.a->unique_id || this->a->unique_id == rhs.a->unique_id && this->b->unique_id >  rhs.b->unique_id; }
    operator Couple() const { return *this; }
public:
    Thing* a;
    Thing* b;
};

我正在尝试使用 c++ std::find 函数:

std::vector<Couple*> generate_couples(std::vector<Thing*> things)
{
    std::vector<Couple*> couples;

    for (unsigned int i = 0; i < things.size(); i++)
    {
        for (unsigned int j = 0; j < things.size(); j++)
        {
            if (things[i] != things[j] && match(things[i], things[j]))
            {
                Couple  c = Couple(things[i], things[j]);
                Couple rc = Couple(things[j], things[i]);

                auto it_c  = std::find(couples.begin(), couples.end(),  c);
                auto it_rc = std::find(couples.begin(), couples.end(), rc);
                if (it_c == couples.end() && it_rc == couples.end())
                    couples.push_back(&c);
            }
        }
    }

    return couples;
}

Visual Studio Community 2017 出现错误:

Error C2679 binary '==': no operator found which takes a right-hand operand of type 'const _Ty' (or there is no acceptable conversion)

源自文件的第 3520 行

c:\program files (x86)\microsoft visual studio17\community\vc\tools\msvc.16.27023\include\xutility

我已经重载了所有比较运算符,包括“==”,我一直在尝试重载转换运算符,因为它在错误的最后一部分中指出。我还尝试在 class 之外定义 operator == 并将其声明为友元函数:

bool operator == (const Couple& lhs, const Couple& rhs)
{ return lhs.a->unique_id == rhs.a->unique_id && lhs.b->unique_id == rhs.b->unique_id; }
class Couple
{
    // ...
    friend bool operator == (const Couple& lhs, const Couple& rhs); 
    // ...
};

并引发错误:

E0344 too many parameters for this operator function

有几个相关问题,最相似的是这个(How to use std::find/std::find_if with a vector of custom class objects?),但我在那里找不到解决问题的方法。

提前感谢您的任何评论和回答!

所以我认为你有一些问题,但最根本的是这个

std::vector<Couple*> couples;

你有一个 Couple 指针的向量 Couple class 的重载运算符再多也无法帮助您在指针向量中找到内容。

您遇到的另一个问题是您将指向局部作用域对象的指针推送到您的向量上。当这些对象超出范围(每次循环都会发生)时,它们将被销毁,并在您的向量中留下指向无效对象的指针。

所以显而易见的第一步是使用 vector<Couple> 而不是 vector<Couple*>。如果您觉得必须使用指针向量,那么您将不得不开始使用 new 分配对象,并按照 MakeCAT 的建议使用各种 find_if

我无法解释 too many parameters for this operator function 错误。发布的代码不应该发生这种情况。所以你可能犯了一些错误,但从上面的代码中看不出。

您正在使用 指针 Couple 的向量,因此 Couple 中定义的运算符不会直接从 std::find 中使用。

您可以使用 std::find_if 取消引用指针并使用 Couple 中的运算符。

auto it_c  = std::find_if(couples.begin(), couples.end(), [&](auto p){ return *p == c; });
auto it_rc = std::find_if(couples.begin(), couples.end(), [&](auto p){ return *p == rc; });