<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Problem mit Rekursion bei Templates ohne Spezialisierung]]></title><description><![CDATA[<p>Ich über gerade etwas mit Templates und mir ist aufgefallen, dass ich einen Stopp der Rekursion nur durch die Spezialisierung für 0 erreichen kann, warum nicht so:</p>
<pre><code class="language-cpp">template &lt;int Number&gt;
struct NonSense {
    const static bool value = Number == 0 ? true : NonSense&lt;Number - 1&gt;::value;
};

int main() {
    NonSense&lt;2&gt;::value;
}
</code></pre>
<pre><code>error: template instantiation depth exceeds maximum of 500 (use -ftemplate-depth-NN to increase the maximum) instantiating `struct NonSense&lt;-0x0000001f2&gt;'
</code></pre>
<p>Sollte er nicht, sobald Number 0 ist, aufhören sich nochmal aufzurufen?</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/146434/problem-mit-rekursion-bei-templates-ohne-spezialisierung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 17:37:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/146434.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 07 May 2006 19:19:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Rekursion bei Templates ohne Spezialisierung on Sun, 07 May 2006 19:19:40 GMT]]></title><description><![CDATA[<p>Ich über gerade etwas mit Templates und mir ist aufgefallen, dass ich einen Stopp der Rekursion nur durch die Spezialisierung für 0 erreichen kann, warum nicht so:</p>
<pre><code class="language-cpp">template &lt;int Number&gt;
struct NonSense {
    const static bool value = Number == 0 ? true : NonSense&lt;Number - 1&gt;::value;
};

int main() {
    NonSense&lt;2&gt;::value;
}
</code></pre>
<pre><code>error: template instantiation depth exceeds maximum of 500 (use -ftemplate-depth-NN to increase the maximum) instantiating `struct NonSense&lt;-0x0000001f2&gt;'
</code></pre>
<p>Sollte er nicht, sobald Number 0 ist, aufhören sich nochmal aufzurufen?</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1052931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1052931</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Sun, 07 May 2006 19:19:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Rekursion bei Templates ohne Spezialisierung on Sun, 07 May 2006 20:04:52 GMT]]></title><description><![CDATA[<p>Erstelle eine explizite Spezialisierung des Templates für Number=0.</p>
<pre><code class="language-cpp">template &lt;int Number&gt;
struct NonSense {
    const static bool value =  NonSense&lt;Number - 1&gt;::value;
};

template &lt;&gt; struct NonSense &lt;0&gt;{
    const static bool value =  true;
};

int main() {
    NonSense&lt;2&gt;::value;
}
</code></pre>
<p>Der Code funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1052967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1052967</guid><dc:creator><![CDATA[wolfgke]]></dc:creator><pubDate>Sun, 07 May 2006 20:04:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Rekursion bei Templates ohne Spezialisierung on Sun, 07 May 2006 20:31:10 GMT]]></title><description><![CDATA[<p>joomoo schrieb:</p>
<blockquote>
<p>...und mir ist aufgefallen, dass ich einen Stopp der Rekursion nur durch die Spezialisierung für 0 erreichen kann, warum nicht so:</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1052993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1052993</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Sun, 07 May 2006 20:31:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Rekursion bei Templates ohne Spezialisierung on Sun, 07 May 2006 20:38:25 GMT]]></title><description><![CDATA[<p>Das liegt daran, daß beim ?:-Operator zur Compilerzeit immer beide alternativen ausgewertet werden. Dadurch bricht die Rekursion nie ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1053000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1053000</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Sun, 07 May 2006 20:38:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Rekursion bei Templates ohne Spezialisierung on Sun, 07 May 2006 20:58:30 GMT]]></title><description><![CDATA[<p>Jester schrieb:</p>
<blockquote>
<p>Das liegt daran, daß beim ?:-Operator zur Compilerzeit immer beide alternativen ausgewertet werden. Dadurch bricht die Rekursion nie ab.</p>
</blockquote>
<p>Achso. Danke, das hab ich gesucht.</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1053024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1053024</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Sun, 07 May 2006 20:58:30 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Rekursion bei Templates ohne Spezialisierung on Mon, 08 May 2006 14:59:36 GMT]]></title><description><![CDATA[<p>Jester schrieb:</p>
<blockquote>
<p>Das liegt daran, daß beim ?:-Operator zur Compilerzeit immer beide alternativen ausgewertet werden. Dadurch bricht die Rekursion nie ab.</p>
</blockquote>
<p>&quot;auswertung&quot; ist hier ein ungünstiger begriff - für gewöhnlich meint man damit ja das ermitteln des &quot;wertes&quot; eines ausdrucks. unter diesem gesichtspunkt wäre es schwer verständlich, warum sich ?: bei templates anders verhalten sollte als beim programmablauf. das problem hier ist dagegen die ermittelung des typs des ergebnisses des ?: operators. dieser hängt von den typen des zweiten und dritten operanden ab - völlig unabhängig davon, was der erste operand ist. folglich müssen irgendwelche templates, die teil dieser operanden sind, zumindest instantiiert werden, um vollständige typen zu erhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1053485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1053485</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 08 May 2006 14:59:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Rekursion bei Templates ohne Spezialisierung on Mon, 08 May 2006 20:22:56 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>das problem hier ist dagegen die ermittelung des typs des ergebnisses des ?: operators. dieser hängt von den typen des zweiten und dritten operanden ab - völlig unabhängig davon, was der erste operand ist. folglich müssen irgendwelche templates, die teil dieser operanden sind, zumindest instantiiert werden, um vollständige typen zu erhalten.</p>
</blockquote>
<p>Ich sehe nicht, inwiefern das die Sache jetzt besser erklärt. Warum darf der Compiler nicht sehen, daß wenn vorne true steht der Ergebnistyp nur vom ersten Operanden abhängt?</p>
<p>edit: Oder soll damit nur int x = true ? 3 : std::vector(); verhindert werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1053770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1053770</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Mon, 08 May 2006 20:22:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Rekursion bei Templates ohne Spezialisierung on Mon, 08 May 2006 22:03:09 GMT]]></title><description><![CDATA[<p>oder auch</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

typedef long long i64;
template&lt;int x&gt; struct Foo { static const int value = -x; };
template&lt;&gt; struct Foo&lt;0&gt; { static const unsigned value = 10; };

const i64 v1 = true ? Foo&lt;10&gt;::value : Foo&lt;9&gt;::value;
const i64 v2 = true ? Foo&lt;10&gt;::value : Foo&lt;0&gt;::value;

int main()
{
	cout &lt;&lt; v1 &lt;&lt; endl;
	cout &lt;&lt; v2 &lt;&lt; endl;
}
</code></pre>
<p>ergibt<br />
-10<br />
4294967286</p>
<p>obwohl der rechte operand nie ausgewertet wird, beeinflußt sein typ doch das ergebnis (ignorieren wir hier mal, daß das formal undefiertes verhalten ist - sicherlich kann man auch ein korrektes beispiel produzieren).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1053813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1053813</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 08 May 2006 22:03:09 GMT</pubDate></item></channel></rss>