【发布时间】:2016-04-17 19:21:26
【问题描述】:
编译器显示错误提示 23:18:错误:将 'const A' 作为 'void A::show()' 的 'this' 参数传递会丢弃限定符 [-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;
}
我得到了上面代码的答案,但是为什么在指针的情况下它工作正常。例如
#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 30 20 我知道在这种情况下我还需要定义自己的删除器。只是在考虑如何做到这一点?
【问题讨论】:
-
您在此程序中使用
const的位置:look here。因为show不是const所以你的错误。由于 C++11std::set::iterator是const双向的。将show设为const,它应该可以工作。 -
老实说,我对您如何设法将
A类类型存储在一个没有比较器的集合中印象深刻。迟早你也得照顾好它。 -
好吧,我检查了两种迭代器 const 和 non const 都在那里。但是是的,在使函数 show const 和是的 Comparator 函数之后,它工作正常。但是,如果我插入相同类类型的指针对象,它工作正常并且没有显示错误,也不需要比较器函数,但是不是基于 int 元素 i 存储指针对象,而是按照元素插入的顺序。你能解释一下为什么会这样吗?
-
和指针一起工作,因为这里指针是const,show()不会修改指针。
-
请阅读tour。并考虑接受对您有帮助的答案。