c++ error C2663:n个重载没有“this”指针的合法转换

【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.

顺序 选择 循环 总结

posted @ 2020-02-25 00:34  kaizenly  阅读(2170)  评论(0编辑  收藏  举报
打赏