不起作用:覆盖类的shared_ptr的默认小于号运算符

时间:2018-08-28 16:40:34

标签: c++ c++11 operator-overloading shared-ptr multiset

全部。我正在尝试使用std::multiset在插入时进行自动排序。它的元素是std::shared_ptrDataCell个对象。这是头文件中的代码:

#include <iostream>
#include <string>
#include <set>
#include <memory>

class DataCell
{
public:
    double _cartesianDistance;
};

typedef std::shared_ptr<DataCell> DataCellPtr;

bool operator<(const DataCellPtr &d1, const DataCellPtr &d2)  {
    std::cout << "lalala" << std::endl;
    return d1->_cartesianDistance < d2->_cartesianDistance;
}

typedef std::multiset<DataCellPtr, std::less<DataCellPtr>> DataCellPtrMultiset;

int main(){
    DataCellPtr d1( new DataCell );
    DataCellPtr d2( new DataCell );
    d1->_cartesianDistance = 1.0;
    d2->_cartesianDistance = 2.0;
    DataCellPtrMultiset dms;
    dms.insert( d1 );
    dms.insert( d2 );
}

预期输出:

lalala
lalala

一切正常,除了我的自定义排序未执行之外,因为我应该将"lalala"打印到我的std::out上,但这是没有发生的。我认为多集正在使用shared_ptr的默认顺序。 _cartesianDistance成员是双精度型。问题:如何覆盖默认的shared_ptr顺序?

1 个答案:

答案 0 :(得分:3)

代替使用std::less,只需提供自己的比较器对象即可:

struct DataCellPtrComparison
{
  bool operator() (const DataCellPtr &d1, const DataCellPtr &d2) const {
    std::cout << "lalala" << std::endl;
    return d1->_cartesianDistance < d2->_cartesianDistance;
  }
};

typedef std::multiset<DataCellPtr, DataCellPtrComparison> DataCellPtrMultiset;

您无法在自己的命名空间中“覆盖” operator<中现有的std::shared_ptr,因为它已经在namespace std中定义,并且可以在ADL之前找到在不同名称空间中具有相同签名的功能。