【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.
顺序 选择 循环 总结