Dalam pengaturcaraan templat C++, kita boleh menggunakan kelas bukan templat sebagai parameter templat, tetapi terdapat sekatan tertentu pada penggunaan ini. Apabila cuba menggunakan jenis bukan templat sebagai parameter templat, anda mungkin menghadapi ralat "Jenis bukan templat tidak boleh digunakan dalam parameter templat." Ralat ini biasanya berlaku kerana pengkompil C++ tidak dapat menentukan cara mengendalikan jenis bukan templat.
Dalam artikel ini, kita akan membincangkan punca ralat ini dan cara membetulkannya. Kami mula-mula akan meneroka punca ralat ini dan kemudian membincangkan cara untuk menyelesaikannya.
Punca ralat
Apabila kita menulis kod berikut:
template <class T, int N> class MyClass { T array[N]; // some code here }; MyClass<int, 10> myClass;
T
dan N
. T
ialah jenis data dan N
ialah integer. Selepas diproses oleh pengkompil, myClass
hendaklah menjadi contoh kelas MyClass
, dengan jenis T
ialah int
, Nilai N
ialah 10
. MyClass
是一个模板类,它有两个模板参数T
和N
。T
是一个数据类型,N
是一个整数。经过编译器的处理后,myClass
应该是一个MyClass
类的实例,其中T
类型为int
,N
值为10
。
问题出在当我们试图将一个非模板类型作为模板参数来使用时,就会产生错误,例如:
template <class T, int N, double D> class MyClass2 { // some code here }; MyClass2<int, 10, 3.14> myClass2;
这个代码将double
类型的值3.14
作为了MyClass2
类的第三个模板参数。这是错误的,因为double
类型不是一个模板参数,不能在模板参数中使用。
然而,有时我们可能会尝试将一个非模板类作为模板参数来使用。这时,我们可能会遇到“非模板类型不能在模板参数中使用”的错误。例如:
class MyClass3 { // some code here }; template <class T, MyClass3 myClass3> class MyClass4 { // some code here }; MyClass4<int, MyClass3> myClass4;
这个代码定义了一个名为MyClass4
的模板类,其中的第二个模板参数是一个名为myClass3
的实例,该实例是MyClass3
类的一个对象。在定义myClass4
时,我们将MyClass3
作为MyClass4
的第二个模板参数。然而,这是错误的,因为MyClass3
不是一个模板参数,不能在模板参数中使用。
解决方法
有一种方法可以解决这个错误,即将非模板类改为模板类。
template <typename T> class MyClass5 { // some code here }; template <class T, template <typename> class N> class MyClass6 { N<T> myClass; // some code here }; MyClass6<int, MyClass5> myClass6;
在这个示例中,MyClass6
类的第二个模板参数已经变成了模板类。这样,我们就可以将一个模板类作为模板参数来使用了。当我们在定义myClass6
时,我们可以使用MyClass5
作为MyClass6
rrreee
Kod ini akan menukar nilai jenisMyClass2
. Ini salah kerana jenis double
bukan parameter templat dan tidak boleh digunakan dalam parameter templat. Walau bagaimanapun, kadangkala kita mungkin cuba menggunakan kelas bukan templat sebagai parameter templat. Pada masa ini, kami mungkin menghadapi ralat "Jenis bukan templat tidak boleh digunakan dalam parameter templat". Contohnya: rrreee
Kod ini mentakrifkan kelas templat bernamaMyClass4
Parameter templat kedua ialah contoh bernama myClass3
, iaitu MyClass3kod> kelas. Apabila mentakrifkan myClass4
, kami menggunakan MyClass3
sebagai parameter templat kedua MyClass4
. Walau bagaimanapun, ini salah kerana MyClass3
bukan parameter templat dan tidak boleh digunakan dalam parameter templat. 🎜🎜Penyelesaian🎜🎜Ada cara untuk menyelesaikan ralat ini, iaitu menukar kelas bukan templat kepada kelas templat. 🎜rrreee🎜Dalam contoh ini, parameter templat kedua kelas MyClass6
telah menjadi kelas templat. Dengan cara ini, kita boleh menggunakan kelas templat sebagai parameter templat. Apabila kami mentakrifkan myClass6
, kami boleh menggunakan MyClass5
sebagai parameter templat kedua MyClass6
. 🎜🎜Menggunakan kaedah ini boleh menyelesaikan ralat "jenis bukan templat tidak boleh digunakan dalam parameter templat" dengan berkesan. Dengan cara ini kita boleh menukar jenis bukan templat kepada jenis templat supaya ia boleh digunakan dalam parameter templat. 🎜🎜Kesimpulan🎜🎜Dalam proses pengaturcaraan templat dalam C++, kadangkala kita mungkin cuba menggunakan kelas bukan templat sebagai parameter templat, tetapi terdapat had untuk penggunaan ini. Kami tidak boleh terus menggunakan kelas bukan templat sebagai parameter templat kerana pengkompil tidak dapat menentukan cara mengendalikan jenis bukan templat ini. Tetapi dengan menukar jenis bukan templat kepada jenis templat, kita boleh menyelesaikan masalah ini. 🎜Atas ialah kandungan terperinci Ralat sintaks C++: jenis bukan templat tidak boleh digunakan dalam parameter templat, bagaimana untuk menyelesaikannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!