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

    顺序 选择 循环 总结

  • 相关阅读:
    MyEclipse配置DataBase Explorer
    Eclipse 如何设置注释的模板
    游戏开发技术
    static_cast 与reinterpret_cast
    一个人的成功取决于晚上的8点至10点经典语录必读
    发送消息给线程
    转载ofstream和ifstream详细用法
    Effective STL笔记
    Making your C++ code robust
    TGA文件
  • 原文地址:https://www.cnblogs.com/Braveliu/p/12359711.html
Copyright © 2020-2023  润新知