Не работает: переопределить оператор по умолчанию меньше, чем shared_ptr класса - PullRequest
0 голосов
/ 28 августа 2018

все. Я пытаюсь использовать std::multiset для автоматического заказа при вставке. Его элементы - от std::shared_ptr до DataCell объектов. Вот код в заголовочном файле:

#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" s на моем std::out, чего не происходит. Я предполагаю, что мультимножество использует порядок по умолчанию shared_ptr. Член _cartesianDistance является двойным. Вопрос: как переопределить порядок по умолчанию shared_ptr?

1 Ответ

0 голосов
/ 28 августа 2018

Вместо использования 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 перед любой функцией с таким же подпись в другом пространстве имен.

...