【1】復現錯誤
error c2663: n個重載沒有“this”指針的合法轉換
錯誤示例代碼:
1 #include <iostream> 2 using namespace std; 3 4 class Student 5 { 6 public: 7 Student(string name, string id, int grade) 8 : m_name(name) 9 , m_id(id) 10 , m_grade(grade) 11 {} 12 13 string name() 14 { 15 return m_name; 16 } 17 18 void name(string newName) 19 { 20 m_name = newName; 21 } 22 23 int grade() const 24 { 25 return m_grade; 26 } 27 28 void grade(int newGrade) 29 { 30 m_grade = newGrade; 31 } 32 33 private: 34 string m_name; 35 string m_id; 36 int m_grade; 37 }; 38 39 int main() 40 { 41 const Student wang_chao("WangChao", "610581", 6); 42 // 場景1:建議將const添加到成員函數重載之一 43 cout << wang_chao.name() << endl; // error c2663 44 45 const Student qin_chuan("QinChuan", "623417", 8); 46 // 場景2:必須從對象聲明中移除const 47 qin_chuan.grade(9); // error c2663 48 49 // 非常量對象可訪問const成員函數 50 Student li_jian("LiJian", "739120", 10); 51 li_jian.name(); 52 li_jian.name("LiJun"); 53 li_jian.grade(); 54 li_jian.grade(11); 55 }
錯誤列表:
【2】原因分析
原因:編譯器未能將this轉換為該成員函數的任何重載版本。
分析:此錯誤可能因為const對象調用非const成員函數導致。
【3】解決方案
(1)從對象聲明中移除const。
(2)將const添加到成員函數重載之一。
正常示例如下:
1 #include <iostream> 2 using namespace std; 3 4 class Student 5 { 6 public: 7 Student(string name, string id, int grade) 8 : m_name(name) 9 , m_id(id) 10 , m_grade(grade) 11 {} 12 13 string name() const // 解決43行編譯錯誤問題 14 { 15 return m_name; 16 } 17 18 void name(string newName) 19 { 20 m_name = newName; 21 } 22 23 int grade() const 24 { 25 return m_grade; 26 } 27 28 void grade(int newGrade) 29 { 30 m_grade = newGrade; 31 } 32 33 private: 34 string m_name; 35 string m_id; 36 int m_grade; 37 }; 38 39 int main() 40 { 41 const Student wang_chao("WangChao", "610581", 6); 42 // 場景1:建議將const添加到成員函數重載之一 43 cout << wang_chao.name() << endl; 44 45 Student qin_chuan("QinChuan", "623417", 8); // 解決47行編譯錯誤問題 46 // 場景2:必須從對象聲明中移除const 47 qin_chuan.grade(9);48 49 // 非常量對象可訪問const成員函數 50 Student li_jian("LiJian", "739120", 10); 51 li_jian.name(); 52 li_jian.name("LiJun"); 53 li_jian.grade(); 54 li_jian.grade(11); 55 }
簡述原委:
43行:欲取(讀)對象成員變量的值,所以接口應該加const限定符。
47行:欲改變(寫)成員變量的值,既然可以改變成員變量的值,那么對象肯定不應該是const對象,估應在聲明時去掉。
good good study, day day up.
順序 選擇 循環 總結