2010-08-25 67 views
1

我有一個簡單的例子,下面不編譯。我得到以下warrning約常量一個類中的const指針面向對象的bug

錯誤消息: 錯誤C2662: 'Cfoo的:: GetNum':無法從 '常量Cfoo的' 到 'Cfoo的&' 轉換將this指針丟失預選賽

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值有關。改變這似乎沒有幫助。

我做錯了什麼?,建議,提示,示例,鏈接?

回答

9

GetNum必須保證它不通過使其一個const成員函數

class Cfoo 
{ 
    public: 
     bool RunMe(const Cfoo * bar) { 
      int i = bar->GetNum() ; 
     } 

     int GetNum() const { // !!! 
      return 7; 
     } 
}; 
4

litb的溶液改變對象的值是在其上的權利。

但是,我想詳細說明編譯器消息的實際含義以及如何對其進行解密。

因此,下面是錯誤消息的更長解釋以及如何在此上下文中理解錯誤消息。我希望這裏的所有專家能糾正我的理解。

「錯誤C2662: 'Cfoo的:: GetNum':不能 將 '這個' 從 '常量 Cfoo的' 指針 'Cfoo的&' 轉換失去 預選賽」

  1. 類型的'bar''Cfoo const *'.

的成員函數,如在'GetNum' OP是考慮聲明爲

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 &'的引用,以便將函數調用參數與函數參數進行匹配。根據8.5.3/5',這是不允許的,因爲reference to non const無法綁定到const

因此,如litb建議,拯救的方式是使Cfoo::GetNum作爲const成員函數。按照13.3.1/3,這種變化,成員函數Cfoo::GetNum現在被認爲是

int Cfoo::GetNum(Cfoo const &dummyimpliedobjectparameter); // note the const

現在,成員函數「呼叫」和「參數」完全匹配和代碼是良好的形成。

@Steven:現在編譯錯誤是否更有意義 ?

相關問題