我们可以将 '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&)。
我正在尝试编写调用 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&)。