我们可以将 'operator<' 定义为 class 的成员函数以与 std::less 一起使用吗?

can we define 'operator<' as member function of a class to work with std::less?

我正在尝试编写调用 std::less 时可以使用的成员函数。我定义了一个 'pqueue' class ,它在内部将内容存储在 dequeue 中,并使用 std::less 进行比较。又定义了一个 class 'myClass' 并且我正在使用 pqueue 来存储 class 的对象。代码如下

#include <iostream>
#include <deque>
#include <algorithm>
#include <functional>

using namespace std;

template <class T> class PQueue
{

   public:

      PQueue();
      ~PQueue();

      void push(T & item);
      void push(T && item);

      T & front();

      using Queue = std::deque<T>;

   protected:
   
      Queue q_;
};


template <class T> PQueue<T>::PriorityQueue()
{
}

template <class T> PQueue<T>::~PriorityQueue()
{
}

template <class T> void PQueue<T>::push(T & item)
{
   q_.emplace_back(item);
}

template <class T> void PQueue<T>::push(T && item)
{
   q_.emplace_back(item);
}

template <class T> T & PQueue<T>::front()
{
   std::partial_sort(q_.begin(), q_.begin()+1, q_.end(), std::less<T>{});

   return q_.front();
}

class myClass
{
    public:
        myClass(int x)
        {
            y = x;
        }
        
        int y;
        
        friend bool operator < (const myClass &obj1, const myClass &obj2);
        /*bool operator < (const myClass &obj)
        {
            return y < obj.y;
        }*/
};

bool operator < (const myClass &obj1, const myClass &obj2)
{
    return obj1.y < obj2.y;
}

int main()
{
    myClass obj1(10);
    myClass obj2(2);
    myClass obj3(100);
    
    PQueue<myClass> queue;
    queue.push(obj1);
    queue.push(obj2);
    queue.push(obj3);
    
    cout << queue.front().y;
    return 0;
}

如果我将 'operator <' 函数定义为 myClass 的友元函数,则以上代码可以正常工作。但是如果我如下定义 'operator <' 函数作为 myClass 的成员函数,它就会抛出错误。

bool operator < (const myClass &obj)
{
    return y < obj.y;
}

错误:

/usr/include/c++/9/bits/stl_function.h:386:20: error: no match for ‘operator<’ (operand types are ‘const myClass’ and ‘const myClass’)
  386 |       { return __x < __y; }
      |                ~~~~^~~~~
main.cpp:79:14: note: candidate: ‘bool myClass::operator<(const myClass&)’ 
   79 |         bool operator < (const myClass &obj)
      |              ^~~~~~~~
main.cpp:79:14: note:   passing ‘const myClass*’ as ‘this’ argument discards qualifiers

根据错误,很明显 operator< 函数应该将 const 对象作为参数,如果我们将此函数定义为 class 的成员函数是不可能的。但是根据堆栈溢出答案之一,我们可以将其定义为成员函数。

how to use overloaded std::less for std::map

谁能告诉我是否可以将 operator< 函数定义为用于 std::less 的成员函数,如果可以,请告诉我代码中的任何错误。

此答案来自 'Jarod42' 发表的评论。

缺少 const(最后)-> bool operator < (const myClass &obj) const 否则它就像 friend 函数是 friend bool operator < (myClass&, const myClass&)。