Dans la programmation de modèles C++, nous pouvons utiliser une classe non-modèle comme paramètre de modèle, mais il existe certaines restrictions sur cette utilisation. Lorsque vous essayez d'utiliser un type non-modèle comme paramètre de modèle, vous pouvez rencontrer l'erreur « Les types non-modèles ne peuvent pas être utilisés dans les paramètres de modèle. » Cette erreur se produit généralement car le compilateur C++ ne peut pas déterminer comment gérer le type non-modèle.
Dans cet article, nous discuterons des causes de cette erreur et comment y remédier. Nous explorerons d’abord les causes de cette erreur, puis discuterons des moyens de la résoudre.
Cause de l'erreur
Lorsque nous écrivons le code suivant :
template <class T, int N> class MyClass { T array[N]; // some code here }; MyClass<int, 10> myClass;
MyClass
dans le code est une classe modèle, qui a deux paramètres de modèle T
et N
. T
est un type de données et N
est un entier. Après traitement par le compilateur, myClass
doit être une instance de la classe MyClass
, où le type T
est int
, La valeur de N
est 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
Ce code convertira une valeur de typedouble
en 3.14 code> sert de troisième paramètre de modèle de la classe MyClass2
. C'est faux car le type double
n'est pas un paramètre de modèle et ne peut pas être utilisé dans les paramètres de modèle. Cependant, nous pouvons parfois essayer d'utiliser une classe non-modèle comme paramètre de modèle. À ce stade, nous pouvons rencontrer l'erreur « Les types non-modèles ne peuvent pas être utilisés dans les paramètres du modèle ». Par exemple : rrreee
Ce code définit une classe de modèle nomméeMyClass4
. Le deuxième paramètre de modèle est une instance nommée myClass3
, qui est MyClass3code> classe. Lors de la définition de myClass4
, nous utilisons MyClass3
comme deuxième paramètre de modèle de MyClass4
. Cependant, c'est faux car MyClass3
n'est pas un paramètre de modèle et ne peut pas être utilisé dans les paramètres de modèle. 🎜🎜Solution🎜🎜Il existe un moyen de résoudre cette erreur, qui consiste à remplacer la classe non-modèle par une classe modèle. 🎜rrreee🎜Dans cet exemple, le deuxième paramètre de modèle de la classe MyClass6
est devenu la classe modèle. De cette façon, nous pouvons utiliser une classe de modèle comme paramètre de modèle. Lorsque nous définissons myClass6
, nous pouvons utiliser MyClass5
comme deuxième paramètre de modèle de MyClass6
. 🎜🎜L'utilisation de cette méthode peut résoudre efficacement l'erreur « Le type non-modèle ne peut pas être utilisé dans les paramètres du modèle ». De cette façon, nous pouvons changer les types non-modèles en types de modèles afin qu'ils puissent être utilisés dans les paramètres du modèle. 🎜🎜Conclusion🎜🎜Dans le processus de programmation de modèles en C++, nous pouvons parfois essayer d'utiliser une classe non-modèle comme paramètre de modèle, mais il existe des limites à cette utilisation. Nous ne pouvons pas utiliser directement une classe non-modèle comme paramètre de modèle car le compilateur ne peut pas déterminer comment gérer ce type non-modèle. Mais en changeant le type non-modèle en type modèle, nous pouvons résoudre ce problème. 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!