2012-11-23 138 views
1

我试着编译时收到此错误信息以下'std :: list <_Ty> :: push_back':无法将'this'指针从'const std :: list <_Ty>'转换为'std :: list <_Ty>''

void MyClass::MyFunc() const 
{ 
     int i= 0; 
     myList.push_back(i); 
} 

我已经吃过的常量,增加了功能,尽管它返回void,修复与功能本身的调用一个相同的问题,但现在,它的使用STL的成员发生,我在想我的代码是非常错误的。作为参考,误差

cannot convert 'this' pointer from 'const MyClass' to 'MyClass &' 

其实我有,因为我继承了这个从别人与编码标准和最佳做法的一个非常滥用的关系发生了什么事情的很少的想法。如果有人能告诉我这个问题是什么问题,我应该在代码中寻找什么,这对我有很大的帮助。

+1

你不能将一个成员func标记为“只读”,然后期望它写入没有问题。 http://msdn.microsoft.com/en-us/library/6ke686zh(v=vs.110).aspx 另外,请注意“const int Func()”和“int Func()const”之间的区别。 – Gaminic

+3

这里有一些关于'const'的含义的误解:_I已经必须将const添加到函数中,尽管它返回void_。 'const'与函数返回的内容无关(除非它返回一个指向成员的指针/引用)。你应该看看原来的错误(你在添加'const'之前得到的那个错误),并试图理解为什么你调用MyFunc()的对象是一个常量对象。 – jogojapan

回答

2

const上的方法意味着它不能修改它被调用的实例,包括任何实例成员。

你需要看看代码库,并且可以修改类实例(这不应该是const)和那些只是提供关于类实例的信息(这应该是const)方法之间的区别。

2

如果myListMyClass一个数据成员,与push_back()要修改的数据myList构件(因此要修改的MyClassthis指向的实例),因此MyFunc()方法不能被标记为const

0

$ 9.3.1/3:当不是用于形成指向成员(5.3.1)的指针的id-表达式(5.1)不是类成员访问语法(5.2.5)的一部分时如果名称查找(3.4)将id表达式中的名称解析为某个类C的非静态非类型成员,并且如果可以评估id表达式,或者C是X或X的基类,使用(* this)(9.3.2)作为后缀表达式将id表达式转换为类成员访问表达式(5.2.5)到 的左边。运营商。

这意思是,表达

myList.push_back(i); 

作为

(*this).myList.push_back(i); 

$ 9.3.1/4处理:非静态成员函数可以被声明为const,易失性或const volatile 。这些cv限定符影响这个指针的类型(9.3.2)。

$ 9.3.2/1:在非静态(9.3)成员函数的主体中,关键字this是一个prvalue表达式,其值是调用该函数的对象的地址。 X类的成员函数中的类型是X *。如果成员函数声明为const,则其类型为const X *,如果成员函数声明为volatile,则其类型为volatile X *,并且如果成员函数声明为const volatile,则其类型为const挥发性X *。

总之,这意味着你的成员函数中'this'的类型'const'是'MyClass const *'。实际上,这意味着Myclass::MyFunc不允许修改'this'指针指向的对象的状态。

假设myList的类型为std :: list,std :: list :: push_back方法修改实例变量'myList',因为它在列表中插入'i'的值。

但是这打破了'const'成员函数MyClass::MyFunc的语义,它承诺它不会修改对象的状态。

所以,你真的需要从这个成员函数中删除'const'或者使用const_cast去除这个特定操作的const。

相关问题