error C2662: “Screen::move”: 不能将“this”指针从“const Screen”转换为“ Screen &” 转换丢失限定符

清泛原创
出错代码:
//成员函数定义
Screen& Screen::move(index r,index c)
{
    index row = r * width;
    cursor = row + c;
    return *this;
}
const Screen& Screen::display(std::ostream& os) const
{
    os << contents << '\n';
    return *this;
}
//main中处理
myScreen.display(cout).move(4,0).set('#').display(cout); 

解决办法:通过返回调用函数的对象的引用,可以将一些操作链接起来简化代码书写。

这里要注意,display函数返回的是const引用,因此在调用move函数中返回非const引用时无法实现转换导致出错。

解决的办法就是通过成员函数是否为const实现函数重载,定义两套函数,分别作为const成员函数和非const成员函数。

代码片段如下:

//通过是否为const成员函数实现重载
Screen& display(std::ostream &os)
        {do_display(os);return *this;}
const Screen& display(std::ostream &os) const
        {do_display(os);return *this;}
//提取公共函数
void do_display(std::ostream &os) const
        {os<<contents;}
//main中处理
int main()
{
    Screen myScreen(5,3);
    const Screen blank(5,3);

    //调用非const版本display
    myScreen.display(cout).set('#').display(cout);
    cout << endl;

    //调用 const版本display
    blank.display(cout);
    return 0;
}

这样非常量myScreen调用非const版本的display函数,而const的blank对象调用const版本的display函数,从而避免了混淆。

error C2662 丢失限定符

分享到:
评论加载中,请稍后...
创APP如搭积木 - 创意无限,梦想即时!
回到顶部