Dalam C , kata kunci "typename" diperlukan apabila merujuk kepada nama bersarang yang merupakan nama bergantung, iaitu bersarang di dalam contoh templat dengan parameter yang tidak diketahui.
A nama bergantung ialah nama yang tidak boleh diselesaikan sepenuhnya pada masa penyusunan kerana ia bergantung pada parameter templat. Contohnya, dalam kod berikut:
template<class K> class C { struct P {}; vector<P> vec; void f(); }; template<class K> void C<K>::f() { typename vector<P>::iterator p = vec.begin(); }
Nama vektor
::iterator ialah nama bergantung kerana ia bergantung pada parameter templat K. Pada masa penyusunan, pengkompil tidak mengetahui nilai daripada K, jadi ia tidak dapat menyelesaikan sepenuhnya vektor nama
::iterator.
Kata kunci "typename" digunakan untuk memberitahu pengkompil bahawa nama vektor
::iterator ialah nama jenis, walaupun ia tidak dapat diselesaikan sepenuhnya pada masa penyusunan. Ini perlu kerana pengkompil perlu mengetahui jenis pembolehubah p untuk menghasilkan kod yang betul.
Terdapat kes lain di mana "nama taip" mesti dinyatakan, seperti apabila merujuk kepada jenis bersarang yang diisytiharkan di dalam kelas templat. Contohnya, dalam kod berikut:
template<class T> struct A { typedef typename T::type my_type; };
Nama jenis nama T::jenis ialah nama jenis bersarang yang diisytiharkan di dalam kelas templat A. Pada masa penyusunan, pengkompil tidak mengetahui jenis T, jadi ia tidak dapat menyelesaikan sepenuhnya nama taip T::type.
Kata kunci "typename" digunakan untuk memberitahu pengkompil bahawa nama typename T::type ialah jenis nama, walaupun ia tidak dapat diselesaikan sepenuhnya pada masa penyusunan. Ini perlu kerana pengkompil perlu mengetahui jenis pembolehubah my_type untuk menjana kod yang betul.
Atas ialah kandungan terperinci Bilakah Kata Kunci `typename` C Diperlukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!