c – 运算符==重载抽象类和shared_ptr

我想在抽象类的shared_ptr列表中使用std :: find,但是我收到了一个错误.有没有办法比较两个shared_ptr通过在std :: find中解除引用它们?

是否有可能让朋友操作符==重载shared_ptr< A>?

最小的例子:

#include "point.h"
#include <list>
#include <algorithm>
#include <memory>

using namespace std;

class A {

protected:
    Point loc;
public:

    virtual void foo() = 0;

    virtual bool operator==(const Point& rhs) const = 0;
};

class B: public A {
    virtual void foo() override{}

    virtual bool operator==(const Point& rhs) const override {
        return rhs == loc;
    }
};

class C {

    list<shared_ptr<A>> l;
    void bar(Point & p) {

        const auto & f = find(l.begin(), l.end(), p); //<-- error is from here
    }
};

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

注意:Point已经有operator ==.

解决方法:

问题:

find()旨在在迭代器范围中找到一个精确值.

您已定义运算符==以将A与Point进行比较.但是您的列表不包含A对象,而是共享指向A对象的指针.不幸的是,将共享指针与Point进行比较并不是定义的.这种不匹配会导致您报告的错误.

解:

一个简单的解决方案是使用find_if()而不是find():它不会查找精确值,但是谓词变为true:

   const auto & f = find_if(l.begin(), l.end(),[p](shared_ptr<A> &a){ return *a==p; });
上一篇:c – 确定访问虚拟功能的合法方式吗?


下一篇:mysql导入数据失败:mysql max_allowed_packet 设置过小