假设定义了一个类class A,里面重载了运算符 = ,如下所示,则在调用时会出现以下错误,尤其是在使用优先队列容器时需要重载运算符时,很容易报以下错误。
void operator=(test& t) { //重载了=,使其能赋值
this->num1 = t.num1;
this->num2 = t.num2;
};
……
priority_queue<test> vt1;
vt1.push(A(1))
但只要稍加修改,加入const,即可成功编译。(参考重载<) 其中第一个const的意思是可以接受const和非const参数,第二个const意思是可以被const参数调用,即可以被const test调用。
void operator=(const test& t){ //重载了=,使其能赋值
this->num1 = t.num1;
this->num2 = t.num2;
};
/*
这里不能出现void operator=(const test& t) const{this……};因为其中修改了
结构体内部的值,而const参数是不允许被修改的,如果强制执行则会在编译阶段就报错。
*/
bool operator<(const test& t) const{ //重载了<,使其能赋值
return this->num1 < t.num1;
};
我推测是priority_queue在执行push的时候,= 默认右边的值是const类型,如果在重载时不加入const,则会出现test = const test,编译器只能找到 test = test,而找不到此转换,于是报错。同样的还有重载>、<等符号。