Heim >Backend-Entwicklung >C++ >C++-Syntaxfehler: Nicht-Template-Typen können nicht in Template-Parametern verwendet werden. Wie lässt sich das Problem beheben?

C++-Syntaxfehler: Nicht-Template-Typen können nicht in Template-Parametern verwendet werden. Wie lässt sich das Problem beheben?

王林
王林Original
2023-08-22 11:37:501174Durchsuche

C++-Syntaxfehler: Nicht-Template-Typen können nicht in Template-Parametern verwendet werden. Wie lässt sich das Problem beheben?

In der C++-Vorlagenprogrammierung können wir eine Nicht-Vorlagenklasse als Vorlagenparameter verwenden, es gibt jedoch bestimmte Einschränkungen für diese Verwendung. Wenn Sie versuchen, einen Nicht-Vorlagentyp als Vorlagenparameter zu verwenden, tritt möglicherweise die Fehlermeldung „Nicht-Vorlagentypen können nicht in Vorlagenparametern verwendet werden“ auf. Dieser Fehler tritt normalerweise auf, weil der C++-Compiler nicht bestimmen kann, wie er mit dem Nicht-Vorlagentyp umgehen soll.

In diesem Artikel besprechen wir die Ursachen dieses Fehlers und wie man ihn beheben kann. Wir werden zunächst die Ursachen dieses Fehlers untersuchen und dann Möglichkeiten zur Behebung besprechen.

Fehlerursache

Wenn wir den folgenden Code schreiben:

template <class T, int N>
class MyClass {
    T array[N];
    // some code here
};

MyClass<int, 10> myClass;

MyClass im Code ist eine Vorlagenklasse, die zwei Vorlagenparameter T und hat N. T ist ein Datentyp und N ist eine Ganzzahl. Nach der Verarbeitung durch den Compiler sollte myClass eine Instanz der Klasse MyClass sein, wobei der Typ T int ist , Der Wert von N ist 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;

这个代码将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

Das Problem besteht darin, dass, wenn wir versuchen, einen Nicht-Vorlagentyp als Vorlagenparameter zu verwenden, ein Fehler auftritt, zum Beispiel:

rrreee

Dieser Code konvertiert einen Wert vom Typ double in 3.14 code> dient als dritter Vorlagenparameter der Klasse MyClass2. Dies ist falsch, da der Typ double kein Vorlagenparameter ist und nicht in Vorlagenparametern verwendet werden kann.

Manchmal versuchen wir jedoch möglicherweise, eine Klasse, die keine Vorlage ist, als Vorlagenparameter zu verwenden. Zu diesem Zeitpunkt tritt möglicherweise die Fehlermeldung „Nicht-Vorlagentypen können nicht in Vorlagenparametern verwendet werden“ auf. Zum Beispiel:

rrreee

Dieser Code definiert eine Vorlagenklasse mit dem Namen MyClass4. Der zweite Vorlagenparameter ist eine Instanz mit dem Namen myClass3, die MyClass3 ist. Code> Klasse. Bei der Definition von myClass4 verwenden wir MyClass3 als zweiten Vorlagenparameter von MyClass4. Dies ist jedoch falsch, da MyClass3 kein Vorlagenparameter ist und nicht in Vorlagenparametern verwendet werden kann. 🎜🎜Lösung🎜🎜Es gibt eine Möglichkeit, diesen Fehler zu beheben, nämlich die Nicht-Vorlagenklasse in eine Vorlagenklasse zu ändern. 🎜rrreee🎜In diesem Beispiel ist der zweite Vorlagenparameter der Klasse MyClass6 zur Vorlagenklasse geworden. Auf diese Weise können wir eine Vorlagenklasse als Vorlagenparameter verwenden. Wenn wir myClass6 definieren, können wir MyClass5 als zweiten Vorlagenparameter von MyClass6 verwenden. 🎜🎜Mit dieser Methode kann der Fehler „Nicht-Vorlagentyp kann nicht in Vorlagenparametern verwendet werden“ effektiv behoben werden. Auf diese Weise können wir Nicht-Vorlagentypen in Vorlagentypen ändern, sodass sie in Vorlagenparametern verwendet werden können. 🎜🎜Fazit🎜🎜Im Prozess der Vorlagenprogrammierung in C++ versuchen wir manchmal, eine Nicht-Vorlagenklasse als Vorlagenparameter zu verwenden, es gibt jedoch Einschränkungen für diese Verwendung. Wir können eine Nicht-Vorlagenklasse nicht direkt als Vorlagenparameter verwenden, da der Compiler nicht bestimmen kann, wie mit diesem Nicht-Vorlagentyp umgegangen werden soll. Aber indem wir den Nicht-Vorlagentyp in einen Vorlagentyp ändern, können wir dieses Problem lösen. 🎜

Das obige ist der detaillierte Inhalt vonC++-Syntaxfehler: Nicht-Template-Typen können nicht in Template-Parametern verwendet werden. Wie lässt sich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn