Bagaimana untuk Memulakan Ahli Statik dalam Fungsi Templat Bersarang dalam C ?

Barbara Streisand
Lepaskan: 2024-11-01 16:47:02
asal
800 orang telah melayarinya

 How to Initialize Static Members in Nested Template Functions in C  ?

Permulaan Ahli Statik C dalam Fungsi Templat Bersarang

Pengamatan ahli statik boleh dicapai melalui struct helper bersarang, terutamanya dalam kelas bukan templat. Walau bagaimanapun, pendekatan ini mungkin menghadapi masalah apabila kelas yang disertakan diparameterkan oleh templat. Khususnya, jika objek pembantu tidak diakses dalam kod utama, kelas pemulaan bersarang mungkin tidak berlaku seketika.

Pertimbangkan contoh mudah berikut, yang menggambarkan pemulaan vektor:

<code class="cpp">struct A {
    struct InitHelper {
        InitHelper() { A::mA = "Hello, I'm A."; }
    };
    static std::string mA;
    static InitHelper mInit;

    static const std::string& getA(){ return mA; }
};
std::string A::mA;
A::InitHelper A::mInit;


template<class T>
struct B {
    struct InitHelper {
        InitHelper() { B<T>::mB = "Hello, I'm B."; }
    };
    static std::string mB;
    static InitHelper mInit;

    static const std::string& getB() { return mB; }
    static InitHelper& getHelper(){ return mInit; }
};
template<class T>
std::string B<T>::mB;
template<class T>
typename B<T>::InitHelper B<T>::mInit;</code>
Salin selepas log masuk

Apabila disusun dengan g 4.4.1, beberapa pemerhatian dibuat:

  • Dengan [1] dan [2] mengulas keluar, A = Hello, saya A. Ini menandakan bahawa permulaan berfungsi seperti yang dimaksudkan.
  • Dengan [1] tidak diulas, A = Helo, saya A. B = Ini menunjukkan bahawa permulaan B::mB tidak dicetuskan secara automatik.
  • Dengan kedua-dua [1] dan [2] tidak diulas, A = Helo, saya A. B = Helo, saya B. Ini mengesahkan bahawa akses kepada B: :mInit (melalui [2]) menghasut pemulaan B::mB.
  • Dengan [1] mengulas dan [2] tidak mengulas, segfault berlaku, menunjukkan bahawa dengan mengakses terus helper itu sendiri, pemulaan B::mB dicuba lebih awal, mengakibatkan ralat.

Tingkah laku ini berpunca daripada tafsiran pengkompil bagi standard ISO/IEC C 2003 (14.7.1). Piawaian menetapkan bahawa:

"Melainkan jika ahli templat kelas atau templat ahli telah dinyatakan secara eksplisit atau dikhususkan secara eksplisit, pengkhususan ahli itu dinyatakan secara tersirat apabila pengkhususan dirujuk dalam konteks yang memerlukan definisi ahli untuk wujud khususnya, permulaan (dan sebarang kesan sampingan yang berkaitan) bagi ahli data statik tidak berlaku melainkan ahli data statik itu sendiri digunakan dengan cara yang memerlukan definisi ahli data statik untuk wujud."

Ini menerangkan sebab, dalam contoh yang diberikan, ahli statik tidak dimulakan sehingga mereka diakses melalui kaedah getB() atau getHelper(). Menyatakan secara eksplisit templat kelas atau templat ahli dalam fungsi utama akan memaksa pemulaannya pada ketika itu. Walau bagaimanapun, untuk senario di mana akses langsung tidak boleh dilaksanakan, piawaian tidak menyatakan penyelesaian yang elegan untuk memulakan ahli statik dalam fungsi templat bersarang.

Atas ialah kandungan terperinci Bagaimana untuk Memulakan Ahli Statik dalam Fungsi Templat Bersarang dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!