首頁 > 後端開發 > C++ > 為什麼從 `std::set` 存取成員函數時會出現「將 'const StudentT' 作為 'this' 參數傳遞」錯誤?

為什麼從 `std::set` 存取成員函數時會出現「將 'const StudentT' 作為 'this' 參數傳遞」錯誤?

Susan Sarandon
發布: 2024-12-26 10:55:14
原創
570 人瀏覽過

Why Do I Get

成員函數呼叫函數限定不一致

在提供的程式碼中,存取成員函數getId() 和getName() 時出現錯誤來自儲存在集合中的物件資料結構。這個問題源自於物件的常數性和成員函數的限定之間的不匹配。

要理解這一點,我們需要記住集合中的物件儲存為常數引用。但是,成員函數 getId 和 getName 沒有宣告為 const,這表示它們可以修改物件的狀態。

發生錯誤的行中:

cout << itr->getId() << " " << itr->getName() << endl;
登入後複製

編譯器偵測到 itr 迭代器指向 const StudentT 對象,根據定義,該物件無法修改。因此,嘗試在const 物件上呼叫非常量成員函數是不允許的,因此會產生錯誤訊息:

../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
登入後複製

要解決此問題,我們必須將成員函數getId 和getName 聲明為const,表明它們不會修改物件的狀態:

int getId() const {
    return id;
}

string getName() const {
    return name;
}
登入後複製

透過將這些函數設為const,我們保證可以在const物件上安全地呼叫它們,從而消除了常數不匹配錯誤。

此外,運算子

StudentT 類別的重載也應聲明為const:
inline bool operator<(const StudentT &s1, const StudentT &s2) {
    return s1.getId() < s2.getId();
}
登入後複製

這可確保比較操作不會嘗試修改正在比較的對象,從而保持程式碼的正確性。

以上是為什麼從 `std::set` 存取成員函數時會出現「將 'const StudentT' 作為 'this' 參數傳遞」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板