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.

順序 選擇 循環 總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM