Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat C++: Diperolehi daripada jenis instantiasi templat tidak dibenarkan, bagaimana untuk menyelesaikannya?

Ralat C++: Diperolehi daripada jenis instantiasi templat tidak dibenarkan, bagaimana untuk menyelesaikannya?

王林
王林asal
2023-08-22 12:45:37737semak imbas

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 sebenarnya adalah jenis instantiasi templat, bukan kelas sebenar. Oleh itu, cuba mendapatkan subkelas baharu daripada jenis instantiated templat akan menyebabkan ralat di atas.

2. Penyelesaian

  1. Gunakan parameter templat

Untuk menyelesaikan masalah ini, kita boleh menggunakan parameter templat untuk menentukan kelas yang akan diterbitkan. Contohnya, jika kita ingin memperoleh kelas baharu daripada MyClass, kita boleh menulis seperti ini:

template<typename T>
class MyClass {
    //...
};

template
class MyDerivedClass: public MyClass {
    //...
};

Ini akan mengelakkan ralat.

  1. Gunakan alias template

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!

Kenyataan:
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