gpt4 book ai didi

c++ - 错误 : passing xxx as 'this' argument of xxx discards qualifiers

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:05 25 4
gpt4 key购买 nike

#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: error: passing 'const StudentT' as 'this' argument of 'int StudentT::getId()' discards qualifiers

../main.cpp:35: error: passing 'const StudentT' as 'this' argument of 'std::string StudentT::getName()' discards qualifiers

这段代码有什么问题?谢谢!

最佳答案

std::set 中的对象存储为 const StudentT .因此,当您尝试调用 getId() 时与 const object 编译器检测到一个问题,主要是你在 const 对象上调用一个非常量成员函数,这是不允许的,因为非常量成员函数没有 promise 不修改对象;所以编译器将做出一个安全假设 getId()可能会尝试修改对象,但与此同时,它也会注意到该对象是常量;所以任何修改 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引用。

关于c++ - 错误 : passing xxx as 'this' argument of xxx discards qualifiers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40350498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com