Soalan:
Pertimbangkan kod berikut:
<code class="cpp">class Bar { public: static const int kConst = 1; void func() { foo(kConst); } }; int main() { Bar b; b.func(); }</code>
Semasa menyusun kod ini, ralat berlaku: "Rujukan tidak ditentukan kepada 'Bar::kConst'". Mengapa ini berlaku, dan bagaimanakah ia boleh diselesaikan?
Jawapan:
Ralat ini berlaku kerana ahli const int statik, jika digunakan (diteruskan ke fungsi atau hantar) , mesti ditakrifkan dalam skop ruang nama.
Menurut bahagian C 11 9.4.2/4:
"Jika ahli data statik adalah daripada jenis kamiran const atau const enumeration, pengisytiharannya dalam takrifan kelas boleh menentukan pemalar-pemula yang hendaklah menjadi ungkapan pemalar integral Dalam kes itu, ahli boleh muncul dalam ungkapan pemalar integral Ahli itu akan tetap ditakrifkan dalam skop ruang nama jika ia digunakan dalam atur cara . ... atau ialah operan pengendali taip dan ... tidak menetapkan nilai jenis kelas polimorfik Objek atau fungsi tidak terlebih beban digunakan jika namanya muncul dalam ungkapan yang berpotensi dinilai."
<.>Walau bagaimanapun, GCC pada mulanya membenarkan menghantar ahli const statik melalui rujukan const tanpa mentakrifkan mereka dalam skop ruang nama. Dalam draf C 0x, ini tidak lagi dibenarkan.Isu praktikal timbul apabila mengambil alamat atau rujukan kepada objek yang tidak wujud seperti ahli const statik. Ini boleh membawa kepada gelagat yang tidak ditentukan jika ia dipanggil daripada berbilang unit terjemahan.Untuk menyelesaikan isu ini, pengubahsuaian berikut boleh dibuat: Tentukan ahli const statik dalam skop ruang nama:Gunakan static_cast
<code class="cpp">int bar::kConst = 1;</code>
Atas ialah kandungan terperinci Mengapa saya mendapat ralat \'Rujukan tidak ditentukan kepada \'Bar::kConst\'\' apabila menggunakan ahli const int statik dalam fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!