Hier ist meine vereinfachte Testcode:Infinite Template-Instantiierung
struct Test {
Test() { run(0); }
template<class T>
static auto run(T&&, bool stop = false) -> void { if (!stop) _run<T>(); }
template<class R>
static auto _run() -> void { []() { run([]() {}, true); }(); }
};
Wenn ich diesen Code mit GCC und Klirren zusammengestellt, es Kompilierungsfehler gibt:
/media/data/caca3d/src/b0util/test/tst_promise.cpp:30: error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum)
static auto _run() -> void { []() { run([]() {}, true); }(); }
~~~^~~~~~~~~~~~~~~~
Ich kann nicht sehen, warum dieser Code Ursachen unendliche Template Instanziierung.
FYI, wenn ich template<class R>
in _run()
Funktion entfernen, sind die Fehler verschwunden.
Ich fand diesen Fehler, wenn ich etwas faule Auswertung mit Lambda-Funktion versuche, so kann ich indirekten Aufruf in Lambda nicht entfernen. Wie kann ich dieses Problem beheben?
Benötigen Sie _run wirklich, um eine Vorlage zu sein? – SingerOfTheFall
Ja. Dieser Code wird nur für den Test vereinfacht. Der tatsächliche Code verwendet die Metaprogrammierung von Vorlagen und Vorlagen stark. – xylosper
ok, danke für die Erstellung des MCVE dann =) – SingerOfTheFall