有人可以告訴我爲什麼在編譯此類時遇到此錯誤?無法將'this'指針轉換爲Class&
class C
{
public:
void func(const C &obj)
{
//body
}
private:
int x;
};
void func2(const C &obj)
{
obj.func(obj);
}
int main() { /*no code here yet*/}
有人可以告訴我爲什麼在編譯此類時遇到此錯誤?無法將'this'指針轉換爲Class&
class C
{
public:
void func(const C &obj)
{
//body
}
private:
int x;
};
void func2(const C &obj)
{
obj.func(obj);
}
int main() { /*no code here yet*/}
C :: func()方法不保證它不會修改對象,它只承諾它不會修改它的參數。修復:
void func(const C &obj) const
{
// don't change any this members or the compiler complains
}
或者使其成爲靜態函數。當它將C對象作爲參數時,它確實聽起來應該是這樣。
您需要將C::func(const C &obj)
標記爲const,因爲您是從const對象調用它的。正確的簽名是這樣的:
void func(const C& obj) const
的問題是,在func2()
你調用使用const對象的非const函數(C::func()
)。
變化C::func()
到簽名:
void func(const C &obj) const
{
// whatever...
}
,以便它可以用const對象調用。
因爲:
this
是常量指針當前OBJ。
因此,你可以讓FUNC爲const:
class C
{
public:
void func(const C &obj) const
{
//body
}
private:
int x;
};
void func2(const C &obj)
{
obj.func(obj);
}
int main() {
return 0;
}
OR
可以去除這個指針的常量性是這樣的:
class C
{
public:
void func(const C &obj)
{
//body
}
private:
int x;
};
void func2(const C &obj)
{
(const_cast<C &>(obj)).func(obj);
}
int main() {
return 0;
}
。希望幫助。
很好的答案。試圖更清楚地說明:由於'func2'接受了一個'const C&'(即對'const C'的引用),這意味着該函數不能修改這個對象實例。這個約束被傳遞給被調用的成員函數'C :: func':預計不會修改對象實例;因此在聲明中需要'const'。 – stakx 2010-07-15 20:40:51
好的,但爲什麼說不能轉換爲C&? – Drew 2010-07-15 20:59:16
這不是一個很好的錯誤消息。我的編譯器說「不能將'這個'指針從'const C'轉換爲'C&'」。哪一個也許不會贏得任何獎品,但是確實說明了一個const正確性問題是問題。 – 2010-07-15 21:06:30