其他分享
首页 > 其他分享> > c – 运算符==重载抽象类和shared_ptr

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,c11,operator-overloading,shared-ptr,polymorphism
来源: https://codeday.me/bug/20190824/1706603.html