首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ const 與同名函數/變量衝突:編譯錯誤 C2064 解析

     編輯:程式設計綜合問答

錯誤代碼重現

const int a() { int a = 10; return a; }
int b() { int b = 5; return b; }
int main() {
    const int a = 0;   // 變量 a 遮蔽函數 a
    int b;
    a = a();           // 錯誤:嘗試調用 const int 變量
    b = b();           // 正常:調用函數 b
    b = a;
    cout << b << endl;
}

錯誤原因

  1. 名稱遮蔽:局部變量 const int a = 0; 在作用域內隱藏了同名函數 a()。
  2. 類型不匹配:表達式 a() 中 a 被解析為 const int 變量,而非函數,無法調用,產生 C2064: term does not evaluate to a function。
  3. const 變量初始化後不可修改,但此處錯誤發生在調用階段,而非賦值階段。

修正方案

// 方案 1:變量改名
const int a_val = 0;
int result = a(); // 調用函數 a()

// 方案 2:函數改名
const int getA() { return 10; }
const int a = 0; // 變量
int val = getA(); // 無歧義

// 方案 3:使用作用域限定(若函數在命名空間/類中)
// int val = ::a(); // 全局函數

最佳實踐

  • 嚴格區分命名風格:函數用動詞/駝峰 getValue(),變量用名詞/下劃線 value_。
  • 避免同一作用域內函數與變量同名。
  • 啟用編譯器警告(/W4、-Wall),可提前發現遮蔽問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved