编译器显示错误说明 23:18:错误:传递' const A'作为'这个'参数' void A :: show()'抛弃限定符[-fpermissive] 想知道我在这个程序中使用const的地方
#include <iostream>
#include <memory>
#include <string>
#include <set>
using namespace std;
class A
{
int i;
public:
A(int pi):i(pi) {}
void show() { cout<<i<<endl; }
~A() { cout<<"Destructor : "<<i<<endl; }
};
int main()
{
set <A> s;
s.emplace(A(40));
s.emplace(A(10));
s.emplace(A(30));
s.emplace(A(20));
set <A>::iterator it;
for(it = s.begin(); it != s.end() ; it++) // Line 23
(*it).show();
return 0;
}
我得到了上面代码的答案,但为什么在指针的情况下工作正常。 e.g。
#include <iostream>
#include <memory>
#include <string>
#include <set>
using namespace std;
class A
{
int i;
public:
A(int pi):i(pi) {}
void show() { cout<<i<<endl; }
~A() { cout<<"Destructor : "<<i<<endl; }
};
int main()
{
set <A *> s;
s.emplace(new A(40));
s.emplace(new A(10));
s.emplace(new A(30));
s.emplace(new A(20));
set <A *>::iterator it;
for(it = s.begin(); it != s.end() ; it++)
(*it)->show();
return 0;
}
输出: 40 10 三十 20 我知道在这种情况下我也需要定义自己的删除器。只是想着怎么做?
答案 0 :(得分:0)
集合包含排序唯一对象集。要对对象进行排序,需要使用比较器,如下所示:
bool operator<(const A& lhs, const A& rhs) {
return lhs.i < rhs.i; // assuming 'i' is public
}
我在代码中看不到任何比较器,您确定能够将“A”类对象插入到集合中吗?
要修复“第23行” - 错误,只需将方法show()
标记为const
,因为const
中的迭代器:
void show() const { cout << i << endl; }
另一种解决方法是const_cast
,但这是不好的做法:
const_cast<A&>(*it).show();
请注意const
在这种情况下非常有意义。否则,您可能会更改已排序的对象(例如:更改值i
)。这可能会破坏排序顺序。