C++ 不工作:重写类的shared_ptr的默认小于运算符

C++ 不工作:重写类的shared_ptr的默认小于运算符,c++,c++11,operator-overloading,shared-ptr,multiset,C++,C++11,Operator Overloading,Shared Ptr,Multiset,全部。我试图使用std::multiset在插入时自动排序。它的元素是std::shared_ptrs到DataCell对象。以下是头文件中的代码: #include <iostream> #include <string> #include <set> #include <memory> class DataCell { public: double _cartesianDistance; }; typedef std::shared

全部。我试图使用
std::multiset
在插入时自动排序。它的元素是
std::shared_ptr
s到
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”
打印到我的
std::out
,但这并没有发生。我想multiset使用的是
共享\u ptr
的默认顺序。
\u cartesianDistance
成员是双精度的。问题:如何覆盖默认的
共享\u ptr
排序?

而不是使用
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;
struct DataCellPtrComparison
{
布尔运算符()(常量DataCellPtr&d1,常量DataCellPtr&d2)常量{
std::cout_cartesiansistance;
}
};
typedef std::multiset DataCellPtrMultiset;

“覆盖”现有的
运算符而不是使用
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;
struct DataCellPtrComparison
{
布尔运算符()(常量DataCellPtr&d1,常量DataCellPtr&d2)常量{
std::cout_cartesiansistance;
}
};
typedef std::multiset DataCellPtrMultiset;

“覆盖”现有的
运算符请确保罪魁祸首是ADL。它正在寻找
操作员您能提供一个吗?缺少一些重要的细节。@Barry,好了。这是解决方案,而不是最初的问题。是的。。。我注意到了。我正要改变它。不,我必须重做。我很确定罪魁祸首是ADL。它正在寻找
操作员您能提供一个吗?缺少一些重要的细节。@Barry,好了。这是解决方案,而不是最初的问题。是的。。。我注意到了。我正要改变它。不,我必须重做。是的,我怀疑(先前的定义)。尽管如此,我还是希望编译器(GCC4.8)会抱怨(多定义)。谢谢你的帮助,但它没有编译。该类型的运算符只需要右侧参数。左边是一个
DataCellPtrComparison
类型的对象。@JeJo一针见血。我只是不明白这是怎么回事(我怀疑是一个
()
操作符,而不是一个“正确的”
操作符(以前的定义)。不过,我希望编译器(GCC 4.8)会抱怨(多定义)。谢谢您的帮助,但它无法编译。这种类型的运算符只需要右侧参数。左侧将是
DataCellPtrComparison
类型的对象。@JeJo说得很对。我只是不明白(一个
()
运算符而不是一个“正确的”
运算符)是怎么回事