您正試圖將學生與字符串進行比較。這種比較不是默認定義的,所以你必須自己定義一個合適的運算符或者寫一些類似(*it).getName() == studentName
的地方,其中getName是Student的成員函數,它返回學生的名字。 另外,您的for循環不正確。它應該是這樣的:
for(auto it = studentList.begin(); it != studentList.end();) {
if((*it).getName() == studentName) {
it = studentList.erase(it);
} else {
++it;
}
}
編輯:如果您決定再在這裏過載比較操作是如何做到這一點小費:
bool operator==(const Student& student, const std::string& name) {
return student.getName() == name;
}
bool operator==(const std::string& name, const Student& student) {
return student == name;
}
bool operator!=(const Student& student, const std::string& name) {
return !(student == name);
}
bool operator!=(const std::string& name, const Student& student) {
return !(student == name);
}
對於這個問題的第一個目的以上四種重載就足夠了,但通常定義幾個版本以避免將來出現意外情況會更好。另外,如果Student類沒有任何成員函數,比如getName(除非Student是一個簡單的結構,所有數據成員都是公開的,否則強烈建議使用此類函數),那麼必須更改第一個重載(其餘部分參考到第一個所以他們會自動調整到改變)是這樣的:
bool operator==(const Student& student, const std::string& name) {
return student.name == name;
}
此外,如果學生的名字是私人或受保護的,也沒有辦法從公共情境訪問它,那麼你也必須在您的學生定義中添加朋友聲明:
class Student {
public:
// Public interface...
private:
std::string name;
friend bool operator==(const Student& student, const std::string& name);
};
朋友聲明的位置不符合只要它在類的定義內。再一次,你只需要讓第一個重載特權,因爲其餘的只是調用第一個特權。
現在可以更改循環:
for(auto it = studentList.begin(); it != studentList.end();) {
if(*it == studentName) {
it = studentList.erase(it);
} else {
++it;
}
}
你忘了的東西: 1.一個完整的代碼示例。 (例如,studentList從不定義) 2.編譯器的實際錯誤。 –