1. ホーム
  2. c++

[解決済み] error: 'this' 引数に xxx を渡すと修飾子が消える

2022-03-21 13:18:23

質問

#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: 'int StudentT::getId()' の 'this' 引数に 'const StudentT' を渡すと、修飾子が破棄されます。

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

このコードのどこが問題なのでしょうか?ありがとうございます。

解決方法は?

のオブジェクトは std::set として格納されます。 const StudentT . そのため getId() を使用して const これは、const 型のメンバ関数はオブジェクトを変更しないという約束をしていないため、許可されていません。 安全 と仮定します。 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 を参照してください。