Heim > Artikel > Backend-Entwicklung > C++-Kompilierungsfehler: Lokale Typen sind als Vorlagenparameter nicht zulässig. Wie gehe ich damit um?
Beim Schreiben von C++-Code treten manchmal Kompilierungsfehler wie „Lokale Typen sind als Vorlagenparameter nicht zulässig“ auf. Dies bedeutet normalerweise, dass wir einen lokalen Typ in einem Vorlagenparameter verwenden, beispielsweise einen Klassen- oder Strukturtyp, der in einer Funktion definiert ist. In diesem Artikel werden wir dieses Problem und seine Lösung besprechen.
Schauen wir uns zunächst an, warum dieser Kompilierungsfehler auftritt. In C++ müssen Vorlagenparameter zur Kompilierungszeit aufgelöst werden, während die lokale Typdefinition zur Laufzeit erfolgt. Daher können lokale Typen nicht als Vorlagenparameter verwendet werden, da der Compiler nicht weiß, wie er sie analysieren soll.
Geben Sie ein Beispiel, um dieses Problem zu veranschaulichen:
#include <iostream> template <typename T> void printSize(const T& arg){ struct localStruct { int i; }myLocalStruct; //定义了一个局部结构体类型 std::cout << "Size of arg = "<<sizeof(arg)<<" "; std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<" "; } int main() { int x = 5; printSize(x); return 0; }
Im obigen Code definieren wir eine Vorlagenfunktion printSize, die einen Parameter arg empfängt. Wir definieren auch einen lokalen Strukturtyp myLocalStruct und verwenden sizeof, um dessen Größe und den Parameter arg zu ermitteln.
Wenn wir diesen Code kompilieren, erhalten wir eine Fehlermeldung: „Lokale Typen sind als Vorlagenparameter nicht zulässig“.
Um dieses Problem zu lösen, müssen wir den lokalen Typ in den globalen Typ konvertieren. Wir können die lokale Typdefinition außerhalb der Funktion verschieben oder sie als Mitgliedstyp der Klasse definieren.
Sehen wir uns an, wie wir den obigen Code mithilfe globaler Typen korrigieren können:
#include <iostream> struct localStruct { int i; }; //将局部结构体类型定义为全局 template <typename T> void printSize(const T& arg){ localStruct myLocalStruct; std::cout << "Size of arg = "<<sizeof(arg)<<" "; std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<" "; } int main() { int x = 5; printSize(x); return 0; }
Jetzt haben wir die lokale Strukturdefinition außerhalb der Funktion verschoben. Dieser Fix wird erfolgreich kompiliert und ausgeführt, und die Ausgabe ist korrekt.
Neben der Konvertierung lokaler Typen in globale Typen besteht eine weitere Lösung darin, den lokalen Typ als Mitgliedstyp der Klasse zu definieren. Dieser Ansatz erfordert etwas zusätzlichen Code, ist aber manchmal praktischer:
#include <iostream> template <typename T> class myClass{ public: struct localStruct { int i; }; void printSize(const T& arg){ localStruct myLocalStruct; std::cout << "Size of arg = "<<sizeof(arg)<<" "; std::cout << "Size of localStruct = "<<sizeof(myLocalStruct)<<" "; } }; int main() { int x = 5; myClass<int> obj; obj.printSize(x); return 0; }
Im obigen Code definieren wir den lokalen Strukturtyp als Mitgliedstyp von myClass. Dieser Fix wird auch erfolgreich kompiliert und ausgeführt und gibt die richtigen Ergebnisse aus.
Zusammenfassend lässt sich sagen, dass wir, wenn wir bei der Verwendung von C++-Vorlagen auf den Kompilierungsfehler „Lokale Typen sind nicht als Vorlagenparameter zulässig“ stoßen, den lokalen Typ in einen globalen Typ oder einen Mitgliedstyp der Klasse konvertieren müssen. Mit diesen Korrekturen kann dieses Problem erfolgreich behoben werden.
Das obige ist der detaillierte Inhalt vonC++-Kompilierungsfehler: Lokale Typen sind als Vorlagenparameter nicht zulässig. Wie gehe ich damit um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!