rekursive Template Instanziierung überschritten maximale Tiefe von 256

8

Ich habe versucht, die faktorielle Implementierung mit constexpr -Funktion neu zu schreiben, aber aus irgendeinem Grund habe ich keine Ahnung, warum ich einen Kompilierungsfehler bekomme:

  

Die rekursive Vorlageninstanziierung überschritt die maximale Tiefe von 256

Eigentlich weiß ich, was die Fehlermeldung bedeutet, aber was ich nicht bin, warum bekomme ich diesen Fehler und warum der Code 1 mit struct arbeitet, aber die zweite mit Funktion nicht. Was ist der Unterschied zwischen ihnen?

%Vor%     
The Mask 02.04.2014, 02:10
quelle

3 Antworten

6

Sie benötigen einen Stoppzustand wie den folgenden:

%Vor%

da f2<N - 1>() instanziiert werden muss, haben Sie in diesem Fall Ihren stop-Zustand:

%Vor%

Aber wenn Sie constexpr verwenden, brauchen Sie nicht wirklich Vorlagen zu verwenden, da der ganze Punkt darin besteht, dass es zur Kompilierzeit gemacht wird, also drehen Sie es in folgendes:

%Vor%     
Shafik Yaghmour 02.04.2014, 02:24
quelle
4

Wenn N == 0 ist, muss der Compiler f2<-1> noch instanziieren, weil der Funktionsaufruf im Code vorhanden ist. Wenn f<-1> instanziiert wird, wird f<-2> instanziiert und so weiter. Wenn Sie diese Anweisung immer wieder anwenden, wird der Compiler die Vorlage erneut durchlaufen, bis sie die maximale Tiefe überschreitet.

    
JKor 02.04.2014 02:16
quelle
2
___ antwort22800328 ___

Sie müssen eine Spezialisierung der Template-Funktion definieren, um die Rekursion bei der Kompilierzeit und nicht bei runtime zu stoppen, genau wie bei Ihrer struct-Version.

%Vor%     
___ qstntxt ___

Ich habe versucht, die faktorielle Implementierung mit %code% -Funktion neu zu schreiben, aber aus irgendeinem Grund habe ich keine Ahnung, warum ich einen Kompilierungsfehler bekomme:

  

Die rekursive Vorlageninstanziierung überschritt die maximale Tiefe von 256

Eigentlich weiß ich, was die Fehlermeldung bedeutet, aber was ich nicht bin, warum bekomme ich diesen Fehler und warum der Code 1 mit %code% arbeitet, aber die zweite mit Funktion nicht. Was ist der Unterschied zwischen ihnen?

%Vor%     
___ answer22800374 ___

Sie benötigen einen Stoppzustand wie den folgenden:

%Vor%

da %code% instanziiert werden muss, haben Sie in diesem Fall Ihren stop-Zustand:

%Vor%

Aber wenn Sie %code% verwenden, brauchen Sie nicht wirklich Vorlagen zu verwenden, da der ganze Punkt darin besteht, dass es zur Kompilierzeit gemacht wird, also drehen Sie es in folgendes:

%Vor%     
___ qstnhdr ___ rekursive Template Instanziierung überschritten maximale Tiefe von 256 ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123templates ___ Das Templates-Tag wird in mehreren Kontexten verwendet: generische Programmierung (insbesondere C ++) und Daten- / Dokumentgenerierung mithilfe von Template-Engines. ___ answer22800293 ___

Wenn %code% ist, muss der Compiler %code% noch instanziieren, weil der Funktionsaufruf im Code vorhanden ist. Wenn %code% instanziiert wird, wird %code% instanziiert und so weiter. Wenn Sie diese Anweisung immer wieder anwenden, wird der Compiler die Vorlage erneut durchlaufen, bis sie die maximale Tiefe überschreitet.

    
___ tag123c11 ___ C ++ 11 ist eine 2011 verabschiedete Version des C ++ - Sprachstandards. Sie hat viele Änderungen und Ergänzungen der Kernsprache sowie der verbesserten und erweiterten C ++ - Standardbibliothek vorgenommen. ___ tag123recursion ___ Rekursion ist eine Art Funktionsaufruf, bei dem sich eine Funktion selbst aufruft. Solche Funktionen werden auch rekursive Funktionen genannt. Strukturelle Rekursion ist eine Methode zur Problemlösung, bei der die Lösung eines Problems von Lösungen für kleinere Instanzen des gleichen Problems abhängt. ___ tag123clang ___ Bei Fragen zum LLVM Compiler Frontend. Verwenden Sie für allgemeine Fragen zu C das C-Tag. ___
songyuanyao 02.04.2014 02:20
quelle

Tags und Links