は、ここに私の簡略化されたテストコードです:私はGCCと打ち鳴らすと、このコードをコンパイルすると無限テンプレートのインスタンス
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); }(); }
};
、それはコンパイルエラーを与える:
/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); }(); }
~~~^~~~~~~~~~~~~~~~
私は、なぜこのコードの原因を見ることができません無限のテンプレートインスタンス化。
template<class R>
_run()
の機能を削除した場合、エラーはなくなりました。
ラムダ関数で遅延評価を試したときにこのエラーが見つかったため、ラムダの間接呼び出しを削除できません。 この問題を解決するにはどうすればよいですか?
最初にテンプレートとして使用するには、実際に_runが必要ですか? – SingerOfTheFall
はい。このコードはテストのために単純化されています。実際のコードは、テンプレートとテンプレートのメタプログラミングを大きく利用しています。 – xylosper
OK、MCVEを作成してくれてありがとう=) – SingerOfTheFall