編譯器未能將 this 轉換為該成員函數的任何重載版本。
此錯誤可能是由調用 const 對象的非 const 成員函數引起的。可能的解決方案:
-
從對象聲明中移除 const。
-
將 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常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。