我在下面有一个不能编译的简单示例。我得到关于const
的以下警告错误讯息: 错误C2662:'Cfoo :: GetNum':无法将'this'指针从'const Cfoo'转换为'Cfoo&'转换失去限定符
class Cfoo
{
public:
bool RunMe( const Cfoo * bar ) {
int i = bar->GetNum() ;
}
int GetNum() {
return 7;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Cfoo a;
Cfoo b;
b.RunMe( &a);
return 0;
}
起初我认为这与GetNum没有返回const值有关。改变这似乎没有帮助。
我做错了什么?,建议,提示,示例,链接?
答案 0 :(得分:9)
GetNum
必须承诺它不会通过使其成为const成员函数来更改对象的值
class Cfoo
{
public:
bool RunMe( const Cfoo * bar ) {
int i = bar->GetNum() ;
}
int GetNum() const { // !!!
return 7;
}
};
答案 1 :(得分:4)
litb的解决方案正是如此。
但是,我想详细说明编译器消息的实际含义以及如何解密它。
因此,这里是错误消息的更长解释以及如何在此上下文中理解它。我希望这里的所有大师都能纠正我的理解。
“错误C2662:'Cfoo :: GetNum':不能 将'this'指针从'const转换 Cfoo'到'Cfoo&'转换失败 限定符“
'bar'
的类型为'Cfoo const *'.
OP中的'GetNum'
等成员函数被视为被声明为
int Cfoo :: GetNum(Cfoo& dummyimpliedobjectparameter); //根据
隐含的对象参数13.3.1/3 and /4
根据13.3.1.1.1/2
函数调用bar->GetNum()
被视为(*bar).GetNum(*bar)
,其中(*bar)
是implied object argument
现在,这意味着,类型'Cfoo const'
的对象必须绑定到类型'Cfoo &'
的引用,以将函数调用参数与函数参数匹配。根据{{1}},由于8.5.3/5'
无法绑定到reference to non const
,因此不允许这样做。
正如litb所建议的那样,拯救的方法是将const
作为Cfoo::GetNum
成员函数。根据{{1}},通过此更改,成员函数const
现在被视为
13.3.1/3
现在,成员函数'call'和'parameter'完全匹配,代码格式正确。
@Steven:编译错误是否更有意义 现在?