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

#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()'丢弃限定符


这段代码出了什么问题?谢谢!


jeck猫
浏览 644回答 3
3回答

HUWWW

其中的对象std::set存储为const StudentT。因此,当您尝试getId()使用const对象调用时,编译器会检测到问题,主要是您在const对象上调用非const成员函数,这是不允许的,因为非const成员函数没有PROMISE不修改对象; 所以编译器会做一个安全的假设,getId()可能会尝试修改对象,但同时,它也注意到对象是const; 所以任何修改const对象的尝试都应该是一个错误。因此编译器会生成错误消息。解决方案很简单:将函数const设为:int getId() const {&nbsp; &nbsp; return id;}string getName() const {&nbsp; &nbsp; return name;}这是必要的,因为现在你可以打电话getId()和getName()在const对象为:void f(const StudentT & s){&nbsp; &nbsp; &nbsp;cout << s.getId();&nbsp; &nbsp;//now okay, but error with your versions&nbsp; &nbsp; &nbsp;cout << s.getName(); //now okay, but error with your versions}作为旁注,您应该实现operator<为:inline bool operator< (const StudentT & s1, const StudentT & s2){&nbsp; &nbsp; return&nbsp; s1.getId() < s2.getId();}注意参数现在是const参考。

30秒到达战场

不修改类实例的成员函数应声明为const:int getId() const {&nbsp; &nbsp; return id;}string getName() const {&nbsp; &nbsp; return name;}任何时候你看到“丢弃限定符”,它正在谈论const或volatile。

慕沐林林

实际上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&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iterator;typedef typename _Rep_type::const_iterator&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const_iterator;在SGI的文档中,它指出:iterator&nbsp; &nbsp; &nbsp; &nbsp;Container&nbsp; Iterator used to iterate through a set.const_iterator Container&nbsp; Const iterator used to iterate through a set. (Iterator and const_iterator are the same type.)另一方面,VC ++ 2008 Express编译你的代码而不抱怨你在set::iterators 上调用非const方法。
打开App,查看更多内容
随时随地看视频慕课网APP