Rumah > Artikel > pembangunan bahagian belakang > Ralat C++: Diperolehi daripada jenis instantiasi templat tidak dibenarkan, bagaimana untuk menyelesaikannya?
Dalam bahasa pengaturcaraan C++, apabila kami menggunakan jenis instantiated templat dalam kelas terbitan, kami mungkin menghadapi masalah yang dilaporkan oleh pengkompil "Diperoleh daripada jenis instantiated templat tidak dibenarkan". Sebab ralat ini ialah kami cuba mendapatkan subkelas baharu daripada jenis instantiated templat, yang bukan kelas itu sendiri. Artikel ini akan menerangkan punca ralat dan memberikan penyelesaian kepada masalah tersebut.
1. Punca ralat
Templat ialah alat pengaturcaraan umum. Ia boleh digunakan untuk mencipta kelas atau fungsi dan boleh digunakan mengikut jenis data yang berbeza. Apabila menggunakan templat, parameter templat perlu ditentukan. Dalam C++, apabila menggunakan templat kelas, nama kelas mesti diikuti dengan senarai parameter. Contohnya:
template<typename T> class MyClass { //... };
Apabila kita menggunakan templat kelas ini, kita perlu menyediakan jenis konkrit:
MyClass<int> myObj;
Ini akan mencipta pengkhususan int templat MyClass.
Walau bagaimanapun, apabila kami menggunakan jenis instantiated templat dalam kelas terbitan, kami akan menghadapi ralat di atas, sebagai contoh:
template<typename T> class MyClass { //... }; class MyDerivedClass: public MyClass{ //... };
Kod ini akan menggesa ralat "Penerbitan daripada jenis instantiated templat tidak dibenarkan".
Sebab ralat ini ialah MyClass
2. Penyelesaian
Untuk menyelesaikan masalah ini, kita boleh menggunakan parameter templat untuk menentukan kelas yang akan diterbitkan. Contohnya, jika kita ingin memperoleh kelas baharu daripada MyClass
template<typename T> class MyClass { //... }; templateclass MyDerivedClass: public MyClass { //... };
Ini akan mengelakkan ralat.
Selain itu, kita juga boleh menggunakan alias template (alias templat) untuk menyelesaikan masalah ini. Alias templat boleh memberikan nama baharu untuk templat, yang sesuai untuk kami gunakan dalam atur cara. Contohnya, dalam kod di atas, alias templat boleh ditakrifkan seperti ini:
template<typename T> using MyNewClass = MyClass<T>; class MyDerivedClass: public MyNewClass<int> { //... };
Dengan cara ini, kelas boleh diperoleh daripada alias templat.
Ringkasan
Dalam C++, menggunakan templat adalah amalan yang sangat biasa, tetapi apabila menggunakan jenis instantiated templat dalam kelas terbitan, adalah mudah untuk menghadapi ralat pengkompil "Diperoleh daripada jenis instantiated templat tidak dibenarkan". Terdapat dua penyelesaian: satu ialah menggunakan parameter templat untuk menentukan kelas yang akan diperoleh, dan satu lagi ialah menggunakan alias templat untuk memberikan nama baharu untuk templat. Dengan kaedah di atas, kita boleh menyelesaikan masalah ini dengan mudah.
Atas ialah kandungan terperinci Ralat C++: Diperolehi daripada jenis instantiasi templat tidak dibenarkan, bagaimana untuk menyelesaikannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!