<?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[Templates]]></title><description><![CDATA[<p><a href="http://c-plusplus.net/forum/viewtopic-var-t-is-128361-and-start-is-0.html" rel="nofollow">lese gerade den artikel in eurem magazin</a></p>
<p>und da stellt sich folgende frage</p>
<p>die template-funktion:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
inline const T&amp; minimum(const T &amp;a, const T &amp;b) {
  return a &lt; b ? a:b;
};
</code></pre>
<p>wieso darf man</p>
<pre><code class="language-cpp">// Verstehe ich
  int z = minimum&lt;int&gt;(x,y);
  std::cout&lt;&lt;z&lt;&lt;'\n';
  char a = 'a', b = 'b';
  // Wieso gibt er hier keinen template-parameter an?
  std::cout&lt;&lt;minimum(a,b)&lt;&lt;'\n';  //Gibt a aus
</code></pre>
<p>(die frage ist im code als kommentar)</p>
<p>danke im voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268833/templates</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 14:17:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268833.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Jun 2010 05:53:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates on Tue, 15 Jun 2010 05:53:34 GMT]]></title><description><![CDATA[<p><a href="http://c-plusplus.net/forum/viewtopic-var-t-is-128361-and-start-is-0.html" rel="nofollow">lese gerade den artikel in eurem magazin</a></p>
<p>und da stellt sich folgende frage</p>
<p>die template-funktion:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
inline const T&amp; minimum(const T &amp;a, const T &amp;b) {
  return a &lt; b ? a:b;
};
</code></pre>
<p>wieso darf man</p>
<pre><code class="language-cpp">// Verstehe ich
  int z = minimum&lt;int&gt;(x,y);
  std::cout&lt;&lt;z&lt;&lt;'\n';
  char a = 'a', b = 'b';
  // Wieso gibt er hier keinen template-parameter an?
  std::cout&lt;&lt;minimum(a,b)&lt;&lt;'\n';  //Gibt a aus
</code></pre>
<p>(die frage ist im code als kommentar)</p>
<p>danke im voraus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912548</guid><dc:creator><![CDATA[.. ... ..]]></dc:creator><pubDate>Tue, 15 Jun 2010 05:53:34 GMT</pubDate></item><item><title><![CDATA[Reply to Templates on Tue, 15 Jun 2010 06:11:18 GMT]]></title><description><![CDATA[<p>Weil der Compiler die template-Parameter aus den Übergabeparametern bestimmen kann.<br />
Das läuft ungefähr so: Der Compiler trifft beim Parsen auf den Ausdruck minimum(a,b). Der Compiler kennt zu diesem Zeitpunkt bereits die Deklaration von minimum. a ist ein char, also muss der erste Übergabeparameter ein char sein, also muss T=char sein. b ist ebenfalls ein char und da T ja bereits ein char ist passt auch der zweite Übergabeparameter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912555</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Tue, 15 Jun 2010 06:11:18 GMT</pubDate></item><item><title><![CDATA[Reply to Templates on Tue, 15 Jun 2010 06:13:57 GMT]]></title><description><![CDATA[<p>verstehe</p>
<p>das heißt dass ich bei den funktionsaufrufen den template-parameter nicht angeben muss?</p>
<p>vielen dank für deine erklärung!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912558</guid><dc:creator><![CDATA[.. ... ..]]></dc:creator><pubDate>Tue, 15 Jun 2010 06:13:57 GMT</pubDate></item><item><title><![CDATA[Reply to Templates on Tue, 15 Jun 2010 06:27:26 GMT]]></title><description><![CDATA[<p>Ja, im Allgemeinen kannst du den template-Parameter weglassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912562</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Tue, 15 Jun 2010 06:27:26 GMT</pubDate></item><item><title><![CDATA[Reply to Templates on Tue, 15 Jun 2010 06:28:44 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912564</guid><dc:creator><![CDATA[.. ... ..]]></dc:creator><pubDate>Tue, 15 Jun 2010 06:28:44 GMT</pubDate></item><item><title><![CDATA[Reply to Templates on Tue, 15 Jun 2010 09:12:15 GMT]]></title><description><![CDATA[<p>Wenn der Compiler sich das aus den Parametern, die Du der Funktion übergibst, selbst ableiten kann dann muss man das nicht mit angeben. Das klappt aber nicht immer: Gegenbeispiele:</p>
<pre><code class="language-cpp">template&lt;class R, class T, class U&gt;
R add(T t, U u)
{
  R r = t;
  t += u;
  return r;
}

…
add&lt;double&gt;(2,3);
</code></pre>
<p>(Man muss R angeben, T und U können automatisch bestimmt werden)</p>
<pre><code class="language-cpp">template&lt;class T&gt;
T add2(T t, T u)
{
  return t+u;
}

…
add(2,3.3); // Klappt nicht!
</code></pre>
<p>denn nach dem ersten Parameter würde T=int gelten. Aber dem zweiten Parameter zufolge käme der Compiler auf T=double. In so einem Fall schlägt die &quot;template argument deduction&quot; einfach fehl. Wenn Du allerdings <code>add&lt;double&gt;(2,2.3)</code> oder <code>add(2.0,3.0)</code> schreibst, klappt es wieder. Das Misslingen der &quot;Template Argument Deduction&quot; ist übrigens kein &quot;harter&quot; Fehler. Das Funktionstemplate wird dann einfach ignoriert. Nur wenn keine passende Funktion übrig bleibt, meckert der Compiler. Manchmal kann es sinvoll sein, &quot;TAD&quot; für einen Parameter auszuschalten. Das geht über einen Trick:</p>
<pre><code class="language-cpp">template&lt;class T&gt; struct identity{typedef T type;};

template&lt;class T&gt;
struct punkt
{
  T x, y;
};

// template&lt;class T&gt;
// punkt&lt;T&gt; operator*(punkt&lt;T&gt; const&amp; p, T faktor);

template&lt;class T&gt;
punkt&lt;T&gt; operator*(punkt&lt;T&gt; const&amp; p, typename identity&lt;T&gt;::type faktor);
//                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
</code></pre>
<p>Obwohl aus identity&lt;T&gt;::type wieder T selbst wird, stellt es einen sogenannten &quot;non-deduced context&quot; dar. Das heißt, der Compiler verwendet diesen Parameter nicht, um T rauszubekommen.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912634</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 15 Jun 2010 09:12:15 GMT</pubDate></item></channel></rss>