<?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 überladenen Template-Funktionen]]></title><description><![CDATA[<p>Hallo,<br />
hier mal ein kleines Problem, dass mich jetzt schon einige Nerven gekostet hat:</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;time.h&gt;
#include &lt;iostream&gt;
#include &lt;utility&gt;

using namespace std;

class Foo {
public:
  template &lt;typename T&gt;
  Foo(T&amp; t) {
    print(t);
    printc(t);
  }

  template &lt;typename T&gt;
  Foo(T* t) {
    print(t);
    printc(t);
  }

  template &lt;typename T&gt;
  void print(T&amp; t) const {
    cout &lt;&lt; &quot;reference&quot; &lt;&lt; endl;
  }

  template &lt;typename T&gt; 
  void print(T* t) const {
    cout &lt;&lt; &quot;pointer&quot; &lt;&lt; endl;
  }

  template &lt;typename T&gt;
  void printc(const T&amp; t) const {
    cout &lt;&lt; &quot;const reference&quot; &lt;&lt; endl;
  }

  template &lt;typename T&gt; 
  void printc(const T* t) const {
    cout &lt;&lt; &quot;const pointer&quot; &lt;&lt; endl;
  }
};

int main ()
{
  int i = 0;

  Foo foo1(i);
  Foo foo2(&amp;i);
}
</code></pre>
<p>Ausgabe:</p>
<blockquote>
<p>reference<br />
const reference<br />
pointer<br />
const reference</p>
</blockquote>
<p>Warum zur Hölle wird statt der const Pointer nur die const Reference Überladung aufgerufen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289847/problem-mit-überladenen-template-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 21:46:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289847.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Jul 2011 08:22:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit überladenen Template-Funktionen on Thu, 14 Jul 2011 08:30:22 GMT]]></title><description><![CDATA[<p>Hallo,<br />
hier mal ein kleines Problem, dass mich jetzt schon einige Nerven gekostet hat:</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;time.h&gt;
#include &lt;iostream&gt;
#include &lt;utility&gt;

using namespace std;

class Foo {
public:
  template &lt;typename T&gt;
  Foo(T&amp; t) {
    print(t);
    printc(t);
  }

  template &lt;typename T&gt;
  Foo(T* t) {
    print(t);
    printc(t);
  }

  template &lt;typename T&gt;
  void print(T&amp; t) const {
    cout &lt;&lt; &quot;reference&quot; &lt;&lt; endl;
  }

  template &lt;typename T&gt; 
  void print(T* t) const {
    cout &lt;&lt; &quot;pointer&quot; &lt;&lt; endl;
  }

  template &lt;typename T&gt;
  void printc(const T&amp; t) const {
    cout &lt;&lt; &quot;const reference&quot; &lt;&lt; endl;
  }

  template &lt;typename T&gt; 
  void printc(const T* t) const {
    cout &lt;&lt; &quot;const pointer&quot; &lt;&lt; endl;
  }
};

int main ()
{
  int i = 0;

  Foo foo1(i);
  Foo foo2(&amp;i);
}
</code></pre>
<p>Ausgabe:</p>
<blockquote>
<p>reference<br />
const reference<br />
pointer<br />
const reference</p>
</blockquote>
<p>Warum zur Hölle wird statt der const Pointer nur die const Reference Überladung aufgerufen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092592</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Thu, 14 Jul 2011 08:30:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit überladenen Template-Funktionen on Thu, 14 Jul 2011 09:09:02 GMT]]></title><description><![CDATA[<p>Sorry, habe einmal <code>print</code> und <code>printc</code> verwechselt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092610</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Thu, 14 Jul 2011 09:09:02 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit überladenen Template-Funktionen on Thu, 14 Jul 2011 09:06:59 GMT]]></title><description><![CDATA[<p>Nö, ist mir nicht klar. Eigentlich ist doch der Compiler so schlau, Überladungen für Pointer-Typen zu erkennen. Sonst könnte man ja auch keine Template Container-Spezialisierungen für Pointer-Typen bauen.<br />
Und bei der nicht-const Variante wird ja durchaus die richtige Überladung aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092614</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Thu, 14 Jul 2011 09:06:59 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit überladenen Template-Funktionen on Thu, 14 Jul 2011 13:15:55 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich denke, das deine Pointerversion von printc ein const T*, was ja ein Pointer auf ein konstantes Objekt ist, erwartet. Du übergibst aber einen konstanten Pointer auf nicht konstantes Objekt, das kann er nur als Referenz auflösen.<br />
Füge doch einfach mal folgende Variante zu und schau was passiert.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
  void printc( T* const t) const {
    cout &lt;&lt; &quot;pointer const&quot; &lt;&lt; endl;
  }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2092745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092745</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 14 Jul 2011 13:15:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit überladenen Template-Funktionen on Thu, 14 Jul 2011 14:09:04 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>Ich denke, das deine Pointerversion von printc ein const T*, was ja ein Pointer auf ein konstantes Objekt ist, erwartet. Du übergibst aber einen konstanten Pointer auf nicht konstantes Objekt, das kann er nur als Referenz auflösen.</p>
</blockquote>
<p>Hmm, mit pointer to const funktionierts. Allerdings übergebe ich ja keinen Pointer auf eine konstantes Objekt, sondern nur einen nicht-const Pointer auf ein nicht-const Objekt.<br />
Ich hätte an dieser Stelle erwartet, dass die implizite Konvertierung von nicht-const zu const-Pointern vorrang hat...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092764</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Thu, 14 Jul 2011 14:09:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit überladenen Template-Funktionen on Thu, 14 Jul 2011 14:13:01 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Du übergibst aber einen konstanten Pointer auf nicht konstantes Objekt</p>
</blockquote>
<p>Der Zeiger ist nicht konstant, bei <code>Foo()</code> wird <code>T</code> als <code>int</code> deduziert. Das gibt dann für <code>T*</code> einen <code>int*</code> und keinen <code>int* const</code> ...</p>
<p>Braunstein schrieb:</p>
<blockquote>
<p>das kann er nur als Referenz auflösen.</p>
</blockquote>
<p>Nein, ohne <code>printc(const T&amp; t)</code> -Überladung ist wird ja auch die <code>&quot;const-pointer&quot;</code> -Version aufgerufen. Die Umwandlung von <code>T*</code> nach <code>T const*</code> ist eine Standardkonvertierung.</p>
<p>Die Umwandlung <code>T* -&gt; T* const&amp;</code> besitzt eine höhere Priorität im Bezug auf Überladungsauflösung, weil hier nur ein Objekt an eine <code>const</code> -Referenz gebunden wird. Bei <code>T* -&gt; T const*</code> hingegen wird der Pointee-Typ selbst verändert ( <code>T -&gt; T const</code> ), es liegt also eine höhere Indirektion vor. Der Überladungsauflösungsalgorithmus versucht ja grundsätzlich, Typen so wenig wie möglich anzupassen, und Top-Level-Referenz hinzufügen ist eben die kleinere Änderung.</p>
<p>Ganz intuitiv ist die Sache aber schon nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092769</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 14 Jul 2011 14:13:01 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit überladenen Template-Funktionen on Thu, 14 Jul 2011 14:20:17 GMT]]></title><link>https://www.c-plusplus.net/forum/post/2092771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092771</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 14 Jul 2011 14:20:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit überladenen Template-Funktionen on Thu, 14 Jul 2011 14:36:23 GMT]]></title><description><![CDATA[<p>OK, danke, kann ich doch wieder ruhig schlafen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2092776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2092776</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Thu, 14 Jul 2011 14:36:23 GMT</pubDate></item></channel></rss>