c++ 錯誤:n個重載沒有“this”指針的合法轉換


msdn解釋:
“function”: number 重載沒有“this”指針的合法轉換

 編譯器未能將 this 轉換為該成員函數的任何重載版本

此錯誤可能是由調用 const 對象的非 const 成員函數引起的。可能的解決方案:

  1. 從對象聲明中移除 const

  2. 將 const 添加到成員函數重載之一。

下面的示例生成 C2663:

// C2663.cpp
struct C {
   void f() volatile {}
   void f() {}
};

struct D {
   void f() volatile;
   void f() const {}
};

const C *pcc;
const D *pcd;

int main() {
   pcc->f();    // C2663
   pcd->f();    // OK
}

 

 正如msdn說的,一般由const引起,一個是const類型,一個非const類型,導致錯誤:

cons的作用
   (1)可以定義const常量         例如:             const int Max=100;   
   (2)便於進行類型檢查            例如:             void f(const int i) { .........}
        編譯器就會知道i是一個常量,不允許修改;
   (3)可以保護被修飾的東西,防止意外的修改,增強程序的健壯性。
        還是上面的例子,如果在函數體內修改了i,編譯器就會報錯;
        例如: 
             void f(const int i) { i=10;//error! }
    (5) 為函數重載提供了一個參考。

  class A
         {
           ......
           void f(int i)       {......} file://一個函數
           void f(int i) const {......} file://上一個函數的重載
            ......
          };

void A::f(itn i)

{}

void A::f(itn i) const

{.....}

 (6) 可以節省空間,避免不必要的內存分配。
         例如:

      #define PI 3.14159         file://常量宏
              const doulbe  Pi=3.14159;  file://此時並未將Pi放入ROM中
              ......
              double i=Pi;               file://此時為Pi分配內存,以后不再分配!
              double I=PI;               file://編譯期間進行宏替換,分配內存
              double j=Pi;               file://沒有內存分配
              double J=PI;               file://再進行宏替換,又一次分配內存!

 const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而#define定義的常量在內存中有若干個拷貝。
  (7) 提高了效率。
           編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM