<?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[Frage zu Templates]]></title><description><![CDATA[<p>Hi,<br />
ich versuche C++ richtig zu lernen und habe dieses Beispiel von Stroustrup:</p>
<pre><code>template&lt;class In, class Out&gt; void copy(In from, In too_far, Out to)
{
  while (from != too_far) {
    *to = *from;
    ++to;
    ++from;
  }
}
</code></pre>
<p>Was mich wundert, ist, dass Pointer verwendet werden, obwohl sie bei der Parameterliste gar nicht als solche deklariert wurden.</p>
<p>Das hier kompiliert allerdings auch ohne zu murren (Warnungen eingeschalten):</p>
<pre><code>template&lt;class In, class Out&gt; void copy(In *from, In *too_far, Out *to)
{
  while (from != too_far) {
    *to = *from;
    ++to;
    ++from;
  }
}
</code></pre>
<p>Was ist nun richtig und weshalb?</p>
<p>L. G.,<br />
IBV</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/328688/frage-zu-templates</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 18:41:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328688.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Oct 2014 22:42:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Templates on Wed, 22 Oct 2014 22:51:43 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich versuche C++ richtig zu lernen und habe dieses Beispiel von Stroustrup:</p>
<pre><code>template&lt;class In, class Out&gt; void copy(In from, In too_far, Out to)
{
  while (from != too_far) {
    *to = *from;
    ++to;
    ++from;
  }
}
</code></pre>
<p>Was mich wundert, ist, dass Pointer verwendet werden, obwohl sie bei der Parameterliste gar nicht als solche deklariert wurden.</p>
<p>Das hier kompiliert allerdings auch ohne zu murren (Warnungen eingeschalten):</p>
<pre><code>template&lt;class In, class Out&gt; void copy(In *from, In *too_far, Out *to)
{
  while (from != too_far) {
    *to = *from;
    ++to;
    ++from;
  }
}
</code></pre>
<p>Was ist nun richtig und weshalb?</p>
<p>L. G.,<br />
IBV</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423443</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 22 Oct 2014 22:51:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Templates on Wed, 22 Oct 2014 23:08:17 GMT]]></title><description><![CDATA[<p>Das Template nimmt alles, was sich wie ein Pointer dereferenziern lässt, also insbesondere auch Pointer. Iteratoren überschreiben operator*, sie können also auch benutzt werden.<br />
Wenn du Pointer übergibst, ist In gleich Typ*. Schreibst du In* (wie im zweiten Fall) ist In nur Typ.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423447</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 22 Oct 2014 23:08:17 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Templates on Thu, 23 Oct 2014 00:14:34 GMT]]></title><description><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Iterator#C.2B.2B" rel="nofollow">http://en.wikipedia.org/wiki/Iterator#C.2B.2B</a> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423453</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 23 Oct 2014 00:14:34 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Templates on Thu, 23 Oct 2014 03:07:34 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>beim Übersetzen eines Templates wird Dir der Compiler nur solche syntaktischen Fehler anmeckern, die er ohne Kenntnis der Templateparameter klären kann.</p>
<p>Erst beim Instanziieren des Templates, wird er Dir auch die anderen Fehler anzeigen können.</p>
<p>Das erste Beispiel kannst Du mit allen Typen instanziieren, die einen Dereferenzoperator kennen. Im zweiten Beispiel mußt Du Zeiger an copy übergeben.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423458</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Thu, 23 Oct 2014 03:07:34 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Templates on Thu, 23 Oct 2014 05:59:03 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Iteratoren überschreiben operator*, sie können also auch benutzt werden.</p>
</blockquote>
<p>Ist das wirklich so? begin() und end() geben doch Pointer zurück.</p>
<p>mgaeckler schrieb:</p>
<blockquote>
<p>Das erste Beispiel kannst Du mit allen Typen instanziieren, die einen Dereferenzoperator kennen. Im zweiten Beispiel mußt Du Zeiger an copy übergeben.</p>
</blockquote>
<p>Fände ich sogar richtiger, da das zweite Beispiel sowas wie Typsicherheit bietet und das erste Beispiel eher zu Fehlern tendiert. Das ist so wie Ducktyping bei dynamisch typisierten Sprachen.</p>
<p>L. G.,<br />
IBV</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423462</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 23 Oct 2014 05:59:03 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Templates on Thu, 23 Oct 2014 06:06:46 GMT]]></title><description><![CDATA[<p>IBV schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Iteratoren überschreiben operator*, sie können also auch benutzt werden.</p>
</blockquote>
<p>Ist das wirklich so? begin() und end() geben doch Pointer zurück.</p>
</blockquote>
<p>Nein. <code>begin()</code> und <code>end()</code> liefern Iteratoren. Pointer sind Iteratoren. Es gibt aber auch Iteratoren, die keine Pointer sind. Iteratoren sind über gewisse Eigenschaften definiert. Sie können mit <code>*</code> dereferenziert und mit <code>++</code> inkrementiert werden. Das gilt für Pointer, aber auch Klassen, die eben diese Operatoren überschreiben. Beispielsweise ist ein Iterator auf ein <code>std::set</code> kein Pointer. Dennoch kann ich den mit dem gezeigten <code>copy</code> verwenden. Zumindest in der Stroustroup-Version. In deiner geht das nicht, da er eben kein Pointer ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423463</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Thu, 23 Oct 2014 06:06:46 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Templates on Thu, 23 Oct 2014 06:24:26 GMT]]></title><description><![CDATA[<p>IBV schrieb:</p>
<blockquote>
<p>Fände ich sogar richtiger, da das zweite Beispiel sowas wie Typsicherheit bietet und das erste Beispiel eher zu Fehlern tendiert. Das ist so wie Ducktyping bei dynamisch typisierten Sprachen.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Das erste Beispiel ist doch ein Paradebeispiel für Ducktyping. Es verhält sich wie ein Pointer, also kann es wie ein Pointer benutzt werden. Und ansonsten gibt's eine Fehlermeldung (zur Compilezeit!), weil man etwas benutzt hat, das nicht wie ein Pointer funktioniert. Ob dahinter letztlich ein Pointer, ein Iterator oder sonstwas steht ist dem Funktionstemplate egal, Hauptsache es kann das Verhalten liefern, das die Funktion braucht. Das zweite Beispiel geht nur mit Pointern.</p>
<p>PS: In C++ würde man aber eher sagen, dass die Funktion etwas erwartet, dass sich wie ein Iterator verhält, nicht etwas, das sich wie ein Pointer verhält. Denn Iterator ist allgemeiner, ein Pointer ist ein Iterator, aber nicht jeder Iterator ist ein Pointer. Gerade das macht das zweite Beispiel auch so schlecht, denn es ist doch gar nicht wichtig, ob es wirklich ein Pointer ist. Das erste Beispiel kümmert sich nur um die Iteratoreigenschaften (Dereferenzierbar, Inkrementierbar, ...), die <em>unter anderem</em> auch von Pointern erfüllt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423467</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 23 Oct 2014 06:24:26 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Templates on Thu, 23 Oct 2014 08:43:43 GMT]]></title><description><![CDATA[<p>Ok, dann hat sich das für mich geklärt. Danke an alle Beteiligten! <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>L. G.,<br />
IBV</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2423493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2423493</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 23 Oct 2014 08:43:43 GMT</pubDate></item></channel></rss>