2010-07-15 109 views
4

有人可以告訴我爲什麼在編譯此類時遇到此錯誤?無法將'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*/} 

回答

11

C :: func()方法不保證它不會修改對象,它只承諾它不會修改它的參數。修復:

void func(const C &obj) const 
    { 
     // don't change any this members or the compiler complains 
    } 

或者使其成爲靜態函數。當它將C對象作爲參數時,它確實聽起來應該是這樣。

+0

很好的答案。試圖更清楚地說明:由於'func2'接受了一個'const C&'(即對'const C'的引用),這意味着該函數不能修改這個對象實例。這個約束被傳遞給被調用的成員函數'C :: func':預計不會修改對象實例;因此在聲明中需要'const'。 – stakx 2010-07-15 20:40:51

+0

好的,但爲什麼說不能轉換爲C&? – Drew 2010-07-15 20:59:16

+0

這不是一個很好的錯誤消息。我的編譯器說「不能將'這個'指針從'const C'轉換爲'C&'」。哪一個也許不會贏得任何獎品,但是確實說明了一個const正確性問題是問題。 – 2010-07-15 21:06:30

2

您需要將C::func(const C &obj)標記爲const,因爲您是從const對象調用它的。正確的簽名是這樣的:

void func(const C& obj) const 
1

的問題是,在func2()你調用使用const對象的非const函數(C::func())。

變化C::func()到簽名:

void func(const C &obj) const 
{ 
    // whatever... 
} 

,以便它可以用const對象調用。

1

因爲:

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; 
} 

。希望幫助。