Aufruf einer Template-Member-Funktion innerhalb von Template-Funktionen
Das bereitgestellte Code-Snippet zeigt einen Fehler, der beim Aufruf einer Template-Member-Funktion aus einer Template-Funktion heraus auftritt :
<code class="cpp">template<class X> struct A { template<int I> void f() {} }; template<class T> void g() { A<T> a; a.f<3>(); // Compilation fails here }</code>
Der Compiler kann diesen Code nicht kompilieren, meldet einen Fehler im Zusammenhang mit einer ungültigen Verwendung des Members und deutet darauf hin, dass „&“ möglicherweise vergessen wurde.
Erklärung
Der Fehler tritt auf, weil der Code versucht, eine Mitgliedsvorlage aufzurufen, ohne vorher explizit das Schlüsselwort „template“ anzugeben. Gemäß dem C-Standard (14.2/4), wenn der Name einer Mitgliedsvorlagenspezialisierung nach einem Punkt oder Pfeil in einem Postfix-Ausdruck oder nach einem verschachtelten Namensspezifizierer in einer qualifizierten ID und dem Postfix-Ausdruck verwendet wird oder die qualifizierte ID explizit von einem Vorlagenparameter abhängt, muss dem Mitgliedsvorlagennamen das Schlüsselwort „template“ vorangestellt werden. Andernfalls wird davon ausgegangen, dass der Name auf eine Nicht-Vorlage verweist.
Lösung
Um dieses Problem zu beheben, muss der Code geändert werden, um die Vorlage explizit anzugeben ' Schlüsselwort vor dem Namen der Mitgliedsvorlage:
<code class="cpp">template<class T> void g() { A<T> a; a.template f<3>(); // add 'template' keyword here }</code>
Mit dieser Änderung kann der Compiler die Funktion der Mitgliedsvorlage korrekt identifizieren und aufrufen, und der Code wird erfolgreich kompiliert.
Das obige ist der detaillierte Inhalt vonWarum kann der Compiler nicht kompilieren, wenn er eine Template-Member-Funktion innerhalb einer Template-Funktion aufruft?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!