Rumah > pembangunan bahagian belakang > C++ > Mengapa Saya Mendapat Ralat 'Rujukan Tidak Ditakrifkan kepada' dengan Pembina Kelas Templat dalam C?

Mengapa Saya Mendapat Ralat 'Rujukan Tidak Ditakrifkan kepada' dengan Pembina Kelas Templat dalam C?

Linda Hamilton
Lepaskan: 2024-12-13 17:55:13
asal
937 orang telah melayarinya

Why Do I Get an

"Rujukan Tidak Ditakrifkan kepada" Pembina Kelas Templat

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.

Isu

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.

Penyelesaian

Terdapat dua pendekatan untuk menyelesaikan isu ini:

Pendekatan 1: Instalasi Templat Eksplisit

Tambah instantiasi templat eksplisit pada penghujung fail cola.cpp:

template class cola<float>;
template class cola<string>;
Salin selepas log masuk

Ini secara jelas mengarahkan pengkompil untuk menjana kod untuk kelas templat cola dengan jenis yang ditentukan.

Pendekatan 2: Pindahkan Pelaksanaan ke Fail Pengepala

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.

Fail Pengepala lwn Unit Terjemahan

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.

Kesimpulan

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!

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