<?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[Auswahl einer Template-Funktion]]></title><description><![CDATA[<p>Werte Gemeinde,</p>
<p>bitte seht euch mal folgenden Code an:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template &lt;typename T&gt;
void f(T parm) {

  ++parm;
}

void g(int &amp;parm) {

  f(parm);
}

int main() {

  int i = 0;
  g(i);
  std::cout &lt;&lt; i &lt;&lt; std::endl;
  g(i);
  std::cout &lt;&lt; i &lt;&lt; std::endl;
  return 0;
}
</code></pre>
<p>Als Ausgabe hätte ich die Zahlen 1 und 2 erwartet, aber weit gefehlt! Stattdessen erhalte ich zweimal die 0.</p>
<p>Offensichtlich wird das Funktions-Template f() als f&lt;int&gt;(), statt als f&lt;int &amp;&gt;() instanziiert, der Parameter also kopiert und nicht als Referenz übergeben. Und dies obwohl in g() der Parameter ja ein int&amp; ist!</p>
<p>Schreibe ich g() um:</p>
<pre><code class="language-cpp">void g(int &amp;parm) {

  f&lt;int &amp;&gt;(parm);
}
</code></pre>
<p>...erhalte ich die Ausgabe wie erwartet.</p>
<p>Ich frage mich (und jetzt euch), ob das ein Fehler des Compilers ist oder ob ich in diesem Punkt Templates nicht richtig verstanden habe. Falls letzteres gilt, wäre ich für eine Erklärung dankbar.</p>
<p>Getestet mit GCC 3.4.2, MinGW-Edition und Visual C++ 6.0.</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/135692/auswahl-einer-template-funktion</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 03:32:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/135692.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 04 Feb 2006 10:36:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Auswahl einer Template-Funktion on Sat, 04 Feb 2006 10:36:58 GMT]]></title><description><![CDATA[<p>Werte Gemeinde,</p>
<p>bitte seht euch mal folgenden Code an:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template &lt;typename T&gt;
void f(T parm) {

  ++parm;
}

void g(int &amp;parm) {

  f(parm);
}

int main() {

  int i = 0;
  g(i);
  std::cout &lt;&lt; i &lt;&lt; std::endl;
  g(i);
  std::cout &lt;&lt; i &lt;&lt; std::endl;
  return 0;
}
</code></pre>
<p>Als Ausgabe hätte ich die Zahlen 1 und 2 erwartet, aber weit gefehlt! Stattdessen erhalte ich zweimal die 0.</p>
<p>Offensichtlich wird das Funktions-Template f() als f&lt;int&gt;(), statt als f&lt;int &amp;&gt;() instanziiert, der Parameter also kopiert und nicht als Referenz übergeben. Und dies obwohl in g() der Parameter ja ein int&amp; ist!</p>
<p>Schreibe ich g() um:</p>
<pre><code class="language-cpp">void g(int &amp;parm) {

  f&lt;int &amp;&gt;(parm);
}
</code></pre>
<p>...erhalte ich die Ausgabe wie erwartet.</p>
<p>Ich frage mich (und jetzt euch), ob das ein Fehler des Compilers ist oder ob ich in diesem Punkt Templates nicht richtig verstanden habe. Falls letzteres gilt, wäre ich für eine Erklärung dankbar.</p>
<p>Getestet mit GCC 3.4.2, MinGW-Edition und Visual C++ 6.0.</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/985504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/985504</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Sat, 04 Feb 2006 10:36:58 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl einer Template-Funktion on Sat, 04 Feb 2006 10:43:12 GMT]]></title><description><![CDATA[<p>Ja, eine Referenz wird intern als eine Variable des drunterliegenden Typs betrachtet, deshalb gilt der Parameter von g() für den Compiler als int-Variable, wenn du ihm nichts anderes erklärst.</p>
<p>PS: Wenn es dir um die Referenzen geht, kannst du ja auch &quot;template&lt;typename T&gt; void f(T**&amp;** parm)&quot; verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/985507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/985507</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 04 Feb 2006 10:43:12 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl einer Template-Funktion on Sat, 04 Feb 2006 10:59:42 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Ja, eine Referenz wird intern als eine Variable des drunterliegenden Typs betrachtet, deshalb gilt der Parameter von g() für den Compiler als int-Variable, wenn du ihm nichts anderes erklärst.</p>
<p>PS: Wenn es dir um die Referenzen geht, kannst du ja auch &quot;template&lt;typename T&gt; void f(T**&amp;** parm)&quot; verwenden.</p>
</blockquote>
<p>Danke für die (schnelle!!) Antwort.</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/985517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/985517</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Sat, 04 Feb 2006 10:59:42 GMT</pubDate></item></channel></rss>