首頁 > 後端開發 > C++ > 主體

在函數中使用 static const int 成員時,為什麼會出現「未定義引用 \'Bar::kConst\'\」錯誤?

Susan Sarandon
發布: 2024-10-30 19:29:03
原創
857 人瀏覽過

Why do I get an

對Static const int 的未定義引用

問題:

考慮以下代碼:

<code class="cpp">class Bar {
public:
  static const int kConst = 1;
  void func() { foo(kConst); }
};

int main() { Bar b; b.func(); }</code>
登入後複製

編譯此程式碼時,出現錯誤:「Undefined reference to 'Bar::kConst'」。為什麼會出現這種情況,如何解決?

答案:

出現此錯誤是因為 static const int 成員,如果使用(傳遞給函數或強制轉換) ,必須在命名空間範圍內定義。

根據C 11 第9.4.2/4 節:

「如果靜態資料成員是const 整型或const 枚舉類型,則其聲明在類別定義可以指定常數初始值設定項,該常數初始值設定項應為整數常數表達式。在命名空間範圍內定義。除非... 是sizeof 運算子的運算元, ... or 是typeid 運算子的運算元,且... 不指定多型類別的左值,如果其名稱出現在可能計算的表達式中,則使用物件或非重載函數。在 C 0x 草案中,不再允許這樣做。

取得不存在物件(如靜態 const 成員)的位址或引用時會出現一個實際問題。如果從多個翻譯單元呼叫它們,這可能會導致未定義的行為。

要解決此問題,可以進行以下修改:

定義靜態const 成員在命名空間範圍內:

  • 使用static_cast(kConst) 強制編譯器建立一個臨時int 物件並傳遞對其的參考:

    <code class="cpp">int bar::kConst = 1;</code>
    登入後複製

以上是在函數中使用 static const int 成員時,為什麼會出現「未定義引用 \'Bar::kConst\'\」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板