我想在抽象类的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; });