Ralat sintaks C++: jenis bukan templat tidak boleh digunakan dalam parameter templat, bagaimana untuk menyelesaikannya?

王林
Lepaskan: 2023-08-22 11:37:50
asal
1145 orang telah melayarinya

Ralat sintaks C++: jenis bukan templat tidak boleh digunakan dalam parameter templat, bagaimana untuk menyelesaikannya?

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;
Salin selepas log masuk

MyClass dalam kod ialah kelas templat, yang mempunyai dua parameter templat 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是一个模板类,它有两个模板参数TNT是一个数据类型,N是一个整数。经过编译器的处理后,myClass应该是一个MyClass类的实例,其中T类型为intN值为10

问题出在当我们试图将一个非模板类型作为模板参数来使用时,就会产生错误,例如:

template <class T, int N, double D>
class MyClass2 {
    // some code here
};

MyClass2<int, 10, 3.14> myClass2;
Salin selepas log masuk

这个代码将double类型的值3.14作为了MyClass2类的第三个模板参数。这是错误的,因为double类型不是一个模板参数,不能在模板参数中使用。

然而,有时我们可能会尝试将一个非模板类作为模板参数来使用。这时,我们可能会遇到“非模板类型不能在模板参数中使用”的错误。例如:

class MyClass3 {
    // some code here
};

template <class T, MyClass3 myClass3>
class MyClass4 {
    // some code here
};

MyClass4<int, MyClass3> myClass4;
Salin selepas log masuk

这个代码定义了一个名为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;
Salin selepas log masuk

在这个示例中,MyClass6类的第二个模板参数已经变成了模板类。这样,我们就可以将一个模板类作为模板参数来使用了。当我们在定义myClass6时,我们可以使用MyClass5作为MyClass6

Masalahnya ialah apabila kita cuba menggunakan jenis bukan templat sebagai parameter templat, ralat akan berlaku, contohnya:

rrreee

Kod ini akan menukar nilai jenis double kepada 3.14 code> berfungsi sebagai parameter templat ketiga bagi kelas MyClass2. 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 bernama MyClass4 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!

Label berkaitan:
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan