<?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 Templatemtaprogrammierung (Fibonacci-Zahlen)]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich versuche gerade mit TMP zur Compilezeit Fibonacci-Zahlen berechnen zu lassen, aber komischerweise kommt immer 0 als Ergebnis raus.<br />
Bitte helft mir <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Hier ist der Code:</p>
<pre><code class="language-cpp">template&lt;int n&gt;
struct fib
{
  static const int value;
};

template&lt;&gt;
struct fib&lt;0&gt;
{
  static const int value = 0;
}

template&lt;&gt;
struct fib&lt;1&gt;
{
  static const int value = 1;
}

template&lt;int n&gt;
const int fib&lt;n&gt;::value = fib&lt;n-1&gt;::value + fib&lt;n-2&gt;::value;

int main()
{
   std::cout &lt;&lt; fib&lt;5&gt;::value &lt;&lt; endl;
   std::cin.peek();
}
</code></pre>
<p>Ausgabe: 0</p>
<p>Vielen Dank schonmal im Voraus für eure Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/287249/problem-mit-templatemtaprogrammierung-fibonacci-zahlen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 13:52:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287249.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 May 2011 09:27:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Templatemtaprogrammierung (Fibonacci-Zahlen) on Wed, 25 May 2011 09:27:40 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich versuche gerade mit TMP zur Compilezeit Fibonacci-Zahlen berechnen zu lassen, aber komischerweise kommt immer 0 als Ergebnis raus.<br />
Bitte helft mir <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Hier ist der Code:</p>
<pre><code class="language-cpp">template&lt;int n&gt;
struct fib
{
  static const int value;
};

template&lt;&gt;
struct fib&lt;0&gt;
{
  static const int value = 0;
}

template&lt;&gt;
struct fib&lt;1&gt;
{
  static const int value = 1;
}

template&lt;int n&gt;
const int fib&lt;n&gt;::value = fib&lt;n-1&gt;::value + fib&lt;n-2&gt;::value;

int main()
{
   std::cout &lt;&lt; fib&lt;5&gt;::value &lt;&lt; endl;
   std::cin.peek();
}
</code></pre>
<p>Ausgabe: 0</p>
<p>Vielen Dank schonmal im Voraus für eure Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068310</guid><dc:creator><![CDATA[Fibonacci]]></dc:creator><pubDate>Wed, 25 May 2011 09:27:40 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Templatemtaprogrammierung (Fibonacci-Zahlen) on Wed, 25 May 2011 09:36:00 GMT]]></title><description><![CDATA[<p>Ich würde es so machen: <a href="http://ideone.com/rmPXF" rel="nofollow">http://ideone.com/rmPXF</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068315</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 25 May 2011 09:36:00 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Templatemtaprogrammierung (Fibonacci-Zahlen) on Wed, 25 May 2011 09:37:33 GMT]]></title><description><![CDATA[<p>Fast:</p>
<pre><code class="language-cpp">template&lt;int n&gt;
struct fib
{
  static const int value = fib&lt;n-1&gt;::value + fib&lt;n-2&gt;::value;
};

template&lt;&gt;
struct fib&lt;0&gt;
{
  static const int value = 0;
};

template&lt;&gt;
struct fib&lt;1&gt;
{
  static const int value = 1;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2068317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068317</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 25 May 2011 09:37:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Templatemtaprogrammierung (Fibonacci-Zahlen) on Wed, 25 May 2011 09:40:11 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Ich würde es so machen: <a href="http://ideone.com/rmPXF" rel="nofollow">http://ideone.com/rmPXF</a></p>
</blockquote>
<p>Sieht irgendwie falsch aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068320</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 25 May 2011 09:40:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Templatemtaprogrammierung (Fibonacci-Zahlen) on Wed, 25 May 2011 09:41:30 GMT]]></title><description><![CDATA[<p>An sich sollte auch dein Programm funktionieren, wenn man alle Syntaxfehler korrigiert, so dass es überhaupt compiliert:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;

template&lt;int n&gt;
struct fib
{
  static const int value;
};

template&lt;&gt;
struct fib&lt;0&gt;
{
  static const int value = 0;
};

template&lt;&gt;
struct fib&lt;1&gt;
{
  static const int value = 1;
};

template&lt;int n&gt;
const int fib&lt;n&gt;::value = fib&lt;n-1&gt;::value + fib&lt;n-2&gt;::value;

int main()
{
  std::cout &lt;&lt; fib&lt;6&gt;::value &lt;&lt; std::endl;
  std::cin.peek();
}
</code></pre>
<p>Daher vermute ich mal, dass du uns nicht das eigentliche Programm gezeigt hast und beim Abschreiben deinen Fehler schon versehentlich korrigiert hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068323</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 25 May 2011 09:41:30 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Templatemtaprogrammierung (Fibonacci-Zahlen) on Wed, 25 May 2011 09:46:32 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Ich würde es so machen: <a href="http://ideone.com/rmPXF" rel="nofollow">http://ideone.com/rmPXF</a></p>
</blockquote>
<p>Sieht irgendwie falsch aus.</p>
</blockquote>
<p>Nö, funktioniert.</p>
<p>Edit: Du hast Recht, die Fibonacci Zahlen beginnen bei 0, habe mit 1 angefangen. Hier korrigiert: <a href="http://ideone.com/Tovce" rel="nofollow">http://ideone.com/Tovce</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068324</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 25 May 2011 09:46:32 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Templatemtaprogrammierung (Fibonacci-Zahlen) on Wed, 25 May 2011 09:44:35 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Ich würde es so machen: <a href="http://ideone.com/rmPXF" rel="nofollow">http://ideone.com/rmPXF</a></p>
</blockquote>
<p>Sieht irgendwie falsch aus.</p>
</blockquote>
<p>Nö, funktioniert.</p>
</blockquote>
<p>Die Ergebnisse sind aber falsch. Die Spezialisierung <code>fib&lt;0&gt;</code> ist nicht in Ordnung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068326</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 25 May 2011 09:44:35 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Templatemtaprogrammierung (Fibonacci-Zahlen) on Wed, 25 May 2011 09:44:45 GMT]]></title><description><![CDATA[<p>Verschieb mal den Initialisierer in die Klasse:</p>
<pre><code class="language-cpp">template&lt;int n&gt;
struct fib
{
  static const int value = fib&lt;n-1&gt;::value + fib&lt;n-2&gt;::value;
};
...
template&lt;int n&gt;
const int fib&lt;n&gt;::value;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2068327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068327</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 25 May 2011 09:44:45 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Templatemtaprogrammierung (Fibonacci-Zahlen) on Wed, 25 May 2011 09:46:45 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Verschieb mal den Initialisierer in die Klasse:</p>
<pre><code class="language-cpp">template&lt;int n&gt;
struct fib
{
  static const int value = fib&lt;n-1&gt;::value + fib&lt;n-2&gt;::value;
};
...
template&lt;int n&gt;
const int fib&lt;n&gt;::value;
</code></pre>
</blockquote>
<p>Wozu braucht es diesen Teil:</p>
<pre><code class="language-cpp">template&lt;int n&gt;
const int fib&lt;n&gt;::value;
</code></pre>
<p>überhaupt noch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068328</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 25 May 2011 09:46:45 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Templatemtaprogrammierung (Fibonacci-Zahlen) on Wed, 25 May 2011 13:21:53 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Wozu braucht es diesen Teil:</p>
<pre><code class="language-cpp">template&lt;int n&gt;
const int fib&lt;n&gt;::value;
</code></pre>
<p>überhaupt noch?</p>
</blockquote>
<p>Wegen der ODR (3.2/3, Definition für used in 3.2/2).</p>
<p>Das gibt uns auch den Hinweis darauf, warum der ursprüngliche Code fehlschlagen kann, da der Kontext</p>
<pre><code class="language-cpp">std::cout &lt;&lt; fib&lt;5&gt;::value
</code></pre>
<p>keinen konstanten Ausdruck auf der rechten Seite benötigt, wird die rechte Seite nur <em>potentiell</em> ausgewertet i.o.S.<br />
Das wiederum bedeutet, dass der Compiler möglicherweise keine Definition benötigt und folglich keine Instantiierung vornimmt. Ohne Instantiierung der Konstanten wird auch nicht der Initialisierer instantiiert.<br />
Natürlich ist das trotzdem komisch, denn ohne den Initialisierer zu instantiieren, kann der Compiler nicht wissen, ob überhaupt ein konstanter Ausdruck vorliegt.<br />
Jedenfalls bieten sich mehrere Lösungen an: entweder wird der Initialisierer verschoben und hängt damit nicht mehr an der Defintion der Konstanten selbst. Oder es wird explizit dafür gesorgt dass eine Instantiierung erfolgt (2). Oder wir wechseln in einen Kontext, der einen konstanten Ausdruck benötigt (3). Oder wir machen aus value einen nicht-konstanten Ausdruck (4).</p>
<pre><code class="language-cpp">template&lt;int n&gt;
const int fib&lt;n&gt;::value = fib&lt;n-1&gt;::value + fib&lt;n-2&gt;::value + 0.0; // (4)

template fib&lt;6&gt;::value; // (2) explizite Instantiierung

int main()
{
    &amp;fib&lt;6&gt;::value; // (2) implizite Instantiierung erforderlich
    std::cout &lt;&lt; sizeof(char[fib&lt;6&gt;::value]); // (3) konstanter Ausdruck erforderlich
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2068470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068470</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 25 May 2011 13:21:53 GMT</pubDate></item></channel></rss>