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 C2440: “return”: 无法从“const Screen”转换为“Screen &”
下一篇:error C2758: “ConstInit::cival”: 必须在构造函数基/成员初始值设定项列表中初始化