<?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[Function Template Specialization]]></title><description><![CDATA[<p>Ich habe gerade den Artikel <a href="http://www.gotw.ca/publications/mill17.htm" rel="nofollow">Why Not Specialize Function Templates?</a> gelesen und mit eigenen Beispielen etwas rumprobiert.<br />
Dabei ist mir aufgefallen, dass folgende zwei Code Snippets, die bis auf die Reihenfolge der Funktionsdefinitionen gleich sind, unterschiedliche Outputs erzeugen (ein aehnliches Beispiel ist irgendwo im Artikel):</p>
<ol>
<li></li>
</ol>
<pre><code class="language-cpp">// (a)
template&lt;typename T&gt;
void Foo( T )
{
	cout &lt;&lt; &quot;Base Foo&quot; &lt;&lt; endl;
}

// (b)
template&lt;typename T&gt;
void Foo( T* )
{
	cout &lt;&lt; &quot;Base Foo*&quot; &lt;&lt; endl;
}

// (c)
template &lt;&gt;
void Foo( int* )
{
	cout &lt;&lt; &quot;Specialization&quot; &lt;&lt; endl;
}

int main()
{
	int i = 0;
	Foo( &amp;i );
}
</code></pre>
<p>Output: Specialization</p>
<ol start="2">
<li></li>
</ol>
<pre><code class="language-cpp">// (a)
template&lt;typename T&gt;
void Foo( T )
{
	cout &lt;&lt; &quot;Base Foo&quot; &lt;&lt; endl;
}

// (c)
template &lt;&gt;
void Foo( int* )
{
	cout &lt;&lt; &quot;Specialization&quot; &lt;&lt; endl;
}

// (b)
template&lt;typename T&gt;
void Foo( T* )
{
	cout &lt;&lt; &quot;Base Foo*&quot; &lt;&lt; endl;
}

int main()
{
	int i = 0;
	Foo( &amp;i );
}
</code></pre>
<p>Output: Base Foo*</p>
<p>Ich verstehe das so:<br />
In 1) ist (c) eine Spezialisierung von (b). Beim Aufruf Foo( &amp;i ) muss sich der Compiler zwischen (b) und (c) entscheiden. Da (c) die Spezialisierung von (b) ist wird (c) ausgefuehrt.<br />
In 2) ist (c) eine Spezialisierung von (a). Beim Aufruf Foo( &amp;i) hat der Compiler keine Wahl sondern muss (b) nehmen, da (b) eine Ueberladung von (a) ist, sich aber Spezialisierungen nicht ueberladen.</p>
<p>Stimmt das so in etwa? Ich habe das ungute Gefuehl, dass das was ich geschrieben habe kreuzfalsch ist <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="😃"
    /><br />
Kann das jemand bestaetigen oder richtigstellen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/304158/function-template-specialization</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 01:52:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/304158.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 May 2012 23:31:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Function Template Specialization on Wed, 30 May 2012 23:31:42 GMT]]></title><description><![CDATA[<p>Ich habe gerade den Artikel <a href="http://www.gotw.ca/publications/mill17.htm" rel="nofollow">Why Not Specialize Function Templates?</a> gelesen und mit eigenen Beispielen etwas rumprobiert.<br />
Dabei ist mir aufgefallen, dass folgende zwei Code Snippets, die bis auf die Reihenfolge der Funktionsdefinitionen gleich sind, unterschiedliche Outputs erzeugen (ein aehnliches Beispiel ist irgendwo im Artikel):</p>
<ol>
<li></li>
</ol>
<pre><code class="language-cpp">// (a)
template&lt;typename T&gt;
void Foo( T )
{
	cout &lt;&lt; &quot;Base Foo&quot; &lt;&lt; endl;
}

// (b)
template&lt;typename T&gt;
void Foo( T* )
{
	cout &lt;&lt; &quot;Base Foo*&quot; &lt;&lt; endl;
}

// (c)
template &lt;&gt;
void Foo( int* )
{
	cout &lt;&lt; &quot;Specialization&quot; &lt;&lt; endl;
}

int main()
{
	int i = 0;
	Foo( &amp;i );
}
</code></pre>
<p>Output: Specialization</p>
<ol start="2">
<li></li>
</ol>
<pre><code class="language-cpp">// (a)
template&lt;typename T&gt;
void Foo( T )
{
	cout &lt;&lt; &quot;Base Foo&quot; &lt;&lt; endl;
}

// (c)
template &lt;&gt;
void Foo( int* )
{
	cout &lt;&lt; &quot;Specialization&quot; &lt;&lt; endl;
}

// (b)
template&lt;typename T&gt;
void Foo( T* )
{
	cout &lt;&lt; &quot;Base Foo*&quot; &lt;&lt; endl;
}

int main()
{
	int i = 0;
	Foo( &amp;i );
}
</code></pre>
<p>Output: Base Foo*</p>
<p>Ich verstehe das so:<br />
In 1) ist (c) eine Spezialisierung von (b). Beim Aufruf Foo( &amp;i ) muss sich der Compiler zwischen (b) und (c) entscheiden. Da (c) die Spezialisierung von (b) ist wird (c) ausgefuehrt.<br />
In 2) ist (c) eine Spezialisierung von (a). Beim Aufruf Foo( &amp;i) hat der Compiler keine Wahl sondern muss (b) nehmen, da (b) eine Ueberladung von (a) ist, sich aber Spezialisierungen nicht ueberladen.</p>
<p>Stimmt das so in etwa? Ich habe das ungute Gefuehl, dass das was ich geschrieben habe kreuzfalsch ist <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="😃"
    /><br />
Kann das jemand bestaetigen oder richtigstellen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217526</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Wed, 30 May 2012 23:31:42 GMT</pubDate></item><item><title><![CDATA[Reply to Function Template Specialization on Thu, 31 May 2012 01:53:06 GMT]]></title><description><![CDATA[<p>Also ich bin da auch nicht so 101% sattelfest, aber ich meine es müsste so sein...</p>
<p>In (1) ist (c) eine Spezialisierung von (b), soweit richtig.<br />
D.h. Basis-Templates sind nur (a) und (b).<br />
Der Compiler muss sich also erstmal nur zwischen (a) und (b) entscheiden. Denn Template-Spezialisierungen machen <em>nicht</em> bei der Overload-Resolution mit, immer nur die Basis-Templates. (Das steht auch im gotw Artikel)</p>
<p>Also ist es T (a) vs. T* (b) und da gewinnt T* (b). Weil das halt besser passt.</p>
<p><em>Dann</em> muss der Compiler das Template (b) instanzieren. Dazu guckt er ob es eine <em>exakt</em> passende Spezialisierung von (b) gibt, und - tadaa - es gibt eine, nämlich (c). Also nimmet er (c).</p>
<p>In (2) ist (c) eine Spezialisierung von (a). Soweit auch noch richtig.<br />
Basis-Templates sind wieder nur (a) und (b).<br />
Der Compiler muss sich wieder zwischen (a) und (b) entscheiden, und wieder gewinnt (b).</p>
<p>Dann guckt der Compiler wieder ob es eine passende Spezialisierung gibt, und diesmal gibt es keine, also nimmt er das Basis-Template (b).</p>
<p>Falls du es so gemeint hast, OK, dann war es nur (für mich) unverständlich formuliert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217531</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 31 May 2012 01:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to Function Template Specialization on Thu, 31 May 2012 06:57:06 GMT]]></title><description><![CDATA[<p>icarus2 schrieb:</p>
<blockquote>
<p>Stimmt das so in etwa?</p>
</blockquote>
<p>Ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217559</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 31 May 2012 06:57:06 GMT</pubDate></item><item><title><![CDATA[Reply to Function Template Specialization on Thu, 31 May 2012 08:45:56 GMT]]></title><description><![CDATA[<p>@ hustbaer<br />
Ja, ich hatte das in etwa so gemeint.</p>
<p>Danke fuer eure Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217605</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Thu, 31 May 2012 08:45:56 GMT</pubDate></item><item><title><![CDATA[Reply to Function Template Specialization on Thu, 31 May 2012 09:09:30 GMT]]></title><description><![CDATA[<p>Wer hat sich denn diese Regeln ausgedacht? <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/2217614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217614</guid><dc:creator><![CDATA[314159265358979__]]></dc:creator><pubDate>Thu, 31 May 2012 09:09:30 GMT</pubDate></item><item><title><![CDATA[Reply to Function Template Specialization on Thu, 31 May 2012 09:22:14 GMT]]></title><description><![CDATA[<p>314159265358979__ schrieb:</p>
<blockquote>
<p>Wer hat sich denn diese Regeln ausgedacht? 0:D</p>
</blockquote>
<p>Das frag ich mich auch gerade (vielleicht aber aus anderen Gründen)... seit wann hängt das von der Reihenfolge der Funktionsdeklarationen (/definitionen?) ab?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217621</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 31 May 2012 09:22:14 GMT</pubDate></item><item><title><![CDATA[Reply to Function Template Specialization on Thu, 31 May 2012 10:07:09 GMT]]></title><description><![CDATA[<p>Must du echt zu jedem meiner Posts deinen beknackten Senf abgeben? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /><br />
GTFO!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2217653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2217653</guid><dc:creator><![CDATA[314159265358979__]]></dc:creator><pubDate>Thu, 31 May 2012 10:07:09 GMT</pubDate></item></channel></rss>