Dalam pengaturcaraan C, kelas templat sering digunakan untuk menyediakan kefungsian generik yang boleh dijadikan instantiated dengan jenis yang berbeza. Walau bagaimanapun, kadangkala apabila menginstant kelas templat, anda mungkin menghadapi ralat "rujukan yang tidak ditentukan".
Ralat ini berlaku apabila pengkompil tidak dapat mencari pelaksanaan untuk pembina kelas templat. Pengkompil biasanya perlu melihat pelaksanaan pembina untuk menjana kod untuk kelas instantiated.
Dalam kod yang disediakan, kelas template cola ditakrifkan dalam cola.h fail pengepala, tetapi pelaksanaannya adalah dalam fail cola.cpp. Apabila menyusun atur cara, pengkompil melihat pengisytiharan templat dalam main.cpp dan cuba untuk secara tersirat membuat intesis kelas cola dengan jenis apungan dan rentetan.
Walau bagaimanapun, memandangkan pengkompil belum lagi melihat pelaksanaan pembina dalam cola.cpp, ia tidak boleh menjana kod untuk kelas termaktub ini, mengakibatkan "rujukan tidak ditentukan kepada" ralat.
Terdapat dua pendekatan untuk menyelesaikan isu ini:
Tambah instantiasi templat eksplisit pada penghujung fail cola.cpp:
template class cola<float>; template class cola<string>;
Ini secara jelas mengarahkan pengkompil untuk menjana kod untuk kelas templat cola dengan jenis yang ditentukan.
Alihkan pelaksanaan pembina kelas templat dan fungsi ahli ke dalam fail pengepala (cola.h dan nodo_colaypila.h).
Ini memastikan bahawa pengkompil melihat pelaksanaan apabila ia membuat instantiate kelas templat, menghapuskan keperluan untuk instantiasi eksplisit.
Dalam Pendekatan 1, instantiation eksplisit dilakukan pada penghujung unit terjemahan (satu fail tersusun) . Ini bermakna semua kod dalam fail itu mesti disusun sebelum instantiasi.
Dalam Pendekatan 2, pelaksanaan adalah dalam fail pengepala, yang disertakan dalam setiap unit terjemahan yang menggunakan kelas templat. Akibatnya, pelaksanaan tersedia kepada pengkompil tanpa mengira susunan penyusunan.
Kedua-dua pendekatan adalah penyelesaian yang sah kepada ralat "rujukan tidak ditentukan" dengan kelas templat. Pilihan bergantung pada keperluan khusus projek. Instalasi eksplisit adalah lebih fleksibel dan membolehkan kawalan yang lebih baik ke atas pengkhususan templat yang dihasilkan. Walau bagaimanapun, mengalihkan pelaksanaan ke fail pengepala adalah lebih biasa dan memberikan lebih fleksibiliti dalam menggunakan kelas templat.
Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat 'Rujukan Tidak Ditakrifkan kepada' dengan Pembina Kelas Templat dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!