为了账号安全,请及时绑定邮箱和手机立即绑定

错误:将xxx作为xxx的'this'参数传递丢弃限定符

错误:将xxx作为xxx的'this'参数传递丢弃限定符

C++
jeck猫 2019-09-18 13:30:22
#include <iostream>#include <set>using namespace std;class StudentT {public:    int id;    string name;public:    StudentT(int _id, string _name) : id(_id), name(_name) {    }    int getId() {        return id;    }    string getName() {        return name;    }};inline bool operator< (StudentT s1, StudentT s2) {    return  s1.getId() < s2.getId();}int main() {    set<StudentT> st;    StudentT s1(0, "Tom");    StudentT s2(1, "Tim");    st.insert(s1);    st.insert(s2);    set<StudentT> :: iterator itr;    for (itr = st.begin(); itr != st.end(); itr++) {        cout << itr->getId() << " " << itr->getName() << endl;    }    return 0;}排队:cout << itr->getId() << " " << itr->getName() << endl;它给出了一个错误:../main.cpp:35:错误:将'const StudentT'作为'int StudentT :: getId()'的'this'参数传递,丢弃限定符../main.cpp:35:错误:将'const StudentT'作为'std :: string的'this'参数传递StudentT :: getName()'丢弃限定符这段代码出了什么问题?谢谢!
查看完整描述

3 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

其中的对象std::set存储为const StudentT。因此,当您尝试getId()使用const对象调用时,编译器会检测到问题,主要是您在const对象上调用非const成员函数,这是不允许的,因为非const成员函数没有PROMISE不修改对象; 所以编译器会做一个安全的假设,getId()可能会尝试修改对象,但同时,它也注意到对象是const; 所以任何修改const对象的尝试都应该是一个错误。因此编译器会生成错误消息。


解决方案很简单:将函数const设为:


int getId() const {

    return id;

}

string getName() const {

    return name;

}

这是必要的,因为现在你可以打电话getId()和getName()在const对象为:


void f(const StudentT & s)

{

     cout << s.getId();   //now okay, but error with your versions

     cout << s.getName(); //now okay, but error with your versions

}

作为旁注,您应该实现operator<为:


inline bool operator< (const StudentT & s1, const StudentT & s2)

{

    return  s1.getId() < s2.getId();

}

注意参数现在是const参考。


查看完整回答
反对 回复 2019-09-18
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

不修改类实例的成员函数应声明为const:


int getId() const {

    return id;

}

string getName() const {

    return name;

}

任何时候你看到“丢弃限定符”,它正在谈论const或volatile。


查看完整回答
反对 回复 2019-09-18
?
慕沐林林

TA贡献2016条经验 获得超9个赞

实际上C ++标准(即C ++ 0x草案)说(tnx to @Xeo&@Ben Voigt指出这一点):


23.2.4关联容器

5对于set和multiset,值类型与键类型相同。对于map和multimap,它等于pair。关联容器中的键是不可变的。

6关联容器的迭代器是双向迭代器类别。对于值类型与键类型相同的关联容器,iterator和const_iterator都是常量迭代器。未指定迭代器和const_iterator是否是同一类型。


因此VC ++ 2008 Dinkumware实现有问题。


老答案:


你得到了这个错误,因为在std lib的某些实现中它set::iterator是相同的set::const_iterator。


例如libstdc ++(随g ++一起提供)有它(在这里查看整个源代码):


typedef typename _Rep_type::const_iterator            iterator;

typedef typename _Rep_type::const_iterator            const_iterator;

在SGI的文档中,它指出:


iterator       Container  Iterator used to iterate through a set.

const_iterator Container  Const iterator used to iterate through a set. (Iterator and const_iterator are the same type.)

另一方面,VC ++ 2008 Express编译你的代码而不抱怨你在set::iterators 上调用非const方法。


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 643 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信