質問:
次のコードを考えてみましょう:
<code class="cpp">class Bar { public: static const int kConst = 1; void func() { foo(kConst); } }; int main() { Bar b; b.func(); }</code>
このコードのコンパイル中に、「'Bar::kConst' への未定義の参照」というエラーが発生します。これはなぜ発生しますか?また、どのように解決できますか?
回答:
このエラーは、静的 const int メンバーが使用されている (関数またはキャストに渡される) ために発生します。 、名前空間スコープで定義する必要があります。
C 11 セクション 9.4.2/4 によると、
「静的データ メンバーが const 整数型または const 列挙型である場合、その宣言はクラス定義では、整数定数式である定数初期化子を指定できます。その場合、メンバーは、プログラム内で使用される場合でも、名前空間スコープ内で定義されます。 🎜>
静的データ メンバーを const 参照で渡すことは、C 11 セクション 3.2/2 に従って「使用」となります:「... が sizeof 演算子のオペランドでない限り、式は潜在的に評価されます。 ... または typeid 演算子のオペランドであり、 ... は多態性クラス型の左辺値を指定しません。その名前が潜在的に評価される式に出現する場合、オブジェクトまたは非オーバーロード関数が使用されます。"しかし、GCC は当初、静的 const メンバーを名前空間スコープ内で定義せずに const 参照によって渡すことを許可していました。 C 0x ドラフトでは、これは許可されなくなりました。静的 const メンバーのような存在しないオブジェクトのアドレスまたは参照を取得するときに、実際的な問題が発生します。これにより、複数の翻訳単位から呼び出された場合に未定義の動作が発生する可能性があります。この問題を解決するには、次の変更を行うことができます。<code class="cpp">int bar::kConst = 1;</code>
<code class="cpp">foo(static_cast<int>(kConst));</code>
以上が関数で static const int メンバーを使用すると、「\'Bar::kConst\' への未定義の参照」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。