#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 StudentT::getName()' の 'this' 引数として渡すと、修飾子が破棄されます
このコードの何が問題なのでしょうか?
ベストアンサー1
内のオブジェクトstd::set
は として保存されます。したがって、オブジェクトを使用してconst StudentT
を呼び出そうとすると、コンパイラーは問題を検出します。主に、const オブジェクトで非 const メンバー関数を呼び出していますが、これは非 const メンバー関数ではオブジェクトが変更されないという保証がないため許可されません。そのため、コンパイラーはオブジェクトの変更を試みる可能性があるという安全な仮定を行いますが、同時に、オブジェクトが const であることも認識します。したがって、const オブジェクトを変更しようとするとエラーになります。したがって、コンパイラーはエラー メッセージを生成します。getId()
const
getId()
解決策は簡単です。関数を次のように const にします。
int getId() const {
return id;
}
string getName() const {
return name;
}
これが必要なのは、次のように const オブジェクトでおよびgetId()
を呼び出すことができるようになったためです。getName()
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
参照用になりました。