stackoverflow上的许多主题已经解决了这个问题,但是我无法为我的例子做好准备。 我有一个类事件,有事件发生的时间。 我想根据那个时间在向量中对这些对象进行排序。
我首先开始实现运算符<,但编译器发出以下错误:
错误1错误C2582:'event''函数在'事件'中不可用c:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ algorithm 3009 1排序
然后我添加了operator =
以下是我使用的代码:
#include <algorithm> // std::sort
#include <vector> // std::vector
using namespace std;
class Event{
public:
const double time;
Event(double);
bool operator<(const Event&);
bool operator=(const Event&);
};
Event::Event(double time) :
time(time){
}
bool Event::operator<(const Event& rhs)
{
return this->time < rhs.time;
}
bool Event::operator=(const Event& rhs)
{
return this->time == rhs.time;
}
int main() {
vector<Event> vector;
Event e1 = Event(10);
Event e2 = Event(5);
Event e3 = Event(7);
vector.push_back(e1);
vector.push_back(e2);
vector.push_back(e3);
sort(vector.begin(), vector.end());
return 0;
}
当我调试时,我注意到我的对象根本没有排序。 它们按我添加的顺序排列。 以下是'vector'变量的摘录:
[0] {time=10.000000000000000 } Event
[1] {time=5.0000000000000000 } Event
[2] {time=7.0000000000000000 } Event
我有以下问题:
答案 0 :(得分:2)
问题是由于Event
成员,无法分配您的班级const double time
的对象。由于成员是const
,因此无法对其进行修改,因此您无法在具有sort
个对象的容器上使用Event
,因为排序需要分配。
删除const
或重新考虑您尝试执行的操作。顺便说一句,你是混淆赋值运算符(operator=
,这是sort
需要) with equality operator (
运算符==`)。
答案 1 :(得分:2)
要对向量内的对象重新排序,对象必须是可复制的(或可移动的)。您必须定义一个operator =(这是一个赋值),其格式为:
Event& operator=(const Event& other)
{
if(&other != this) { this->time = other.time; }
return *this;
}
所以你的operator =的实现是错误的。您正在比较两个对象,但这不是operator =(赋值!)应该做的。它必须将一个对象(其内容)分配给另一个对象,并返回对分配给的对象的引用。 请记住,如果实现赋值运算符,则应提供复制构造函数。
答案 2 :(得分:1)
这是问题的自定义赋值运算符的正确实现:
Event& Event::operator=(const Event& other)
{
if(&other != this) {
// As time is const, we modify it through a secondary reference
// you can say it cheating with the compiler
double &rTime = (double&) this->time;
rTime = other.time; // this modifies this->time variable
}
return *this;
}
此外,还更改赋值运算符的声明:
class Event{
public:
Event& operator=(const Event&);
// other declarations...
};