<?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[Zeitpunkt der Instanziierung von Templates]]></title><description><![CDATA[<p>Guten Abend miteinander,</p>
<p>Mich beschäftigt folgender Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template &lt;typename T&gt;
void Func(T)
{
	std::cout &lt;&lt; &quot;T&quot; &lt;&lt; std::endl;
}

template &lt;typename T&gt;
void Use()
{
	Func(T());
}

void Func(int)
{
	std::cout &lt;&lt; &quot;int&quot; &lt;&lt; std::endl;
}

int main()
{
	Use&lt;double&gt;();
	Use&lt;int&gt;();
}
</code></pre>
<p>Ausgabe (MSVC++):</p>
<pre><code>T
int
</code></pre>
<p>Ausgabe (g++):</p>
<pre><code>T  
T
</code></pre>
<p>Templates werden also unterschiedlich bezüglich ihres Instanziierungszeitpunktes behandelt. Der Microsoft-Compiler führt die Instanziierung von <code>Use()</code> erst in <code>main()</code> durch, daher tritt <code>Func(int)</code> als zusätzlicher Kandidat in der Überladungsauflösung auf und wird schliesslich ausgewählt. Hingegen scheint g++ <code>Use()</code> bereits bei der Definition teilweise zu kompilieren, wo erst eine Funktion (nämlich das allgemeine Template <code>Func(T)</code> ) sichtbar ist.</p>
<p>Was ist laut Standard-C++ richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284255/zeitpunkt-der-instanziierung-von-templates</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 13:03:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284255.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Mar 2011 18:11:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Mon, 28 Mar 2011 18:11:38 GMT]]></title><description><![CDATA[<p>Guten Abend miteinander,</p>
<p>Mich beschäftigt folgender Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template &lt;typename T&gt;
void Func(T)
{
	std::cout &lt;&lt; &quot;T&quot; &lt;&lt; std::endl;
}

template &lt;typename T&gt;
void Use()
{
	Func(T());
}

void Func(int)
{
	std::cout &lt;&lt; &quot;int&quot; &lt;&lt; std::endl;
}

int main()
{
	Use&lt;double&gt;();
	Use&lt;int&gt;();
}
</code></pre>
<p>Ausgabe (MSVC++):</p>
<pre><code>T
int
</code></pre>
<p>Ausgabe (g++):</p>
<pre><code>T  
T
</code></pre>
<p>Templates werden also unterschiedlich bezüglich ihres Instanziierungszeitpunktes behandelt. Der Microsoft-Compiler führt die Instanziierung von <code>Use()</code> erst in <code>main()</code> durch, daher tritt <code>Func(int)</code> als zusätzlicher Kandidat in der Überladungsauflösung auf und wird schliesslich ausgewählt. Hingegen scheint g++ <code>Use()</code> bereits bei der Definition teilweise zu kompilieren, wo erst eine Funktion (nämlich das allgemeine Template <code>Func(T)</code> ) sichtbar ist.</p>
<p>Was ist laut Standard-C++ richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041464</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 28 Mar 2011 18:11:38 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Mon, 28 Mar 2011 19:02:41 GMT]]></title><description><![CDATA[<p>Soviel ich weiss, kommt Templatevervollständigung erst nach Überladung, aber ohne Gewähr.</p>
<p>MfG, EOutOfResources</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041495</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Mon, 28 Mar 2011 19:02:41 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Wed, 30 Mar 2011 12:46:17 GMT]]></title><description><![CDATA[<p>Weiss jemand Genaueres darüber?</p>
<p>Für mich wäre auch interessant zu sehen, wie andere Leute mit solchen Problemen umgehen, sofern sie auftreten. Das kann ja durchaus ein recht mühsamer Bug sein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042301</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 30 Mar 2011 12:46:17 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Wed, 30 Mar 2011 13:20:25 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Weiss jemand Genaueres darüber?</p>
</blockquote>
<p>Ich habe als du gefragt hattest mal den Standard dazu gelesen, aber nichts gefunden, was mir konkret genug für eine Antwort wäre. Ich würde tendenziell eher sagen, der MSVC hat Recht, aber es genügt ein kleiner Nebensatz den ich überlesen habe um alles wieder umzudrehen. Jedenfalls habe ich nirgendwo eine konkrete Definition gefunden, wann die Funktionen aufgelöst werden.</p>
<blockquote>
<p>Für mich wäre auch interessant zu sehen, wie andere Leute mit solchen Problemen umgehen, sofern sie auftreten. Das kann ja durchaus ein recht mühsamer Bug sein...</p>
</blockquote>
<p>Keine Ahnung. Ein Forum mit einem (noch) höherem Niveau befragen? Das ist jedoch schon eine ziemliche Gurufrage, eventuell sogar eine Schwachstelle im Standard die hier vorliegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042337</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 30 Mar 2011 13:20:25 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Wed, 30 Mar 2011 14:03:28 GMT]]></title><description><![CDATA[<p>Ich hatte gehofft, dass das mal einer nachguckt und beantwortet. <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="🙂"
    /> Ich selber weiß es auch nicht. Ich hatte aber mal ähnliche Probleme mit Funktionstemplates, die sich gegenseitig hätten aufrufen sollen. Ich war dann gezwungen, eines davon vorher zu deklarieren. (ui!... jeden Satz mit &quot;Ich&quot; angefangen *schäm*)</p>
<p>Prinzipiell würde ich da dem GCC mehr vertrauen, was name lookup angeht. Der MSVC ist bekannt dafür, dass er kein richtiges 2-phasen-lookup macht, wie es eigentlich vom Standard gefordert ist. Das macht ihn einerseits gnädiger, was fehlende <code>typename</code> s angeht, andererseits werden andere Fehler erst später erkannt (statt in der ersten dann in der zweiten Phase, wo das Template instantiiert wird). Aber am 2-phasen-lookup kann es eigentlich auch nicht liegen. Der Knackpunkt ist hier wahrscheinlich der &quot;POI&quot; (point of instantiation).</p>
<p>Ich habe noch das Buch &quot;C++ Templates -- The Complete Guide&quot; zu Hause liegen. Vielleicht finde ich darin eine passende Erklärung. Ich werd mal heute abend reingucken. Wenn ich mich richtig erinnere war da die Rede von POIs.</p>
<p>Grad mal in einem Draft nach &quot;point of instantiation&quot; gesucht und folgende Stelle (n3225.pdf, §14.6 [temp.res], paragraph 10) gefunden:</p>
<blockquote>
<p>If a name does not depend on a template-parameter (as defined in 14.6.2), a declaration (or set of declarations) for that name shall be in scope at the point where the name appears in the template definition; the name is bound to the declaration (or declarations) found at that point and this binding is not affected by declarations that are visible at the point of instantiation. [ Example:</p>
<pre><code>void f(char);
template&lt;class T&gt; void g(T t) {
  f(1);    // f(char)
  f(T(1)); // dependent
  f(t);    // dependent
  dd++;    // not dependent
           // error: declaration for dd not found
}
enum E { e };
void f(E);
double dd;
void h() {
  g(e);   // will cause one call of f(char) followed
          // by two calls of f(E)
  g(’a’); // will cause three calls of f(char)
}
</code></pre>
<p>—end example ]</p>
</blockquote>
<p>Sieht für mich grad so aus, als wär würde der GCC da etwas falsch machen (compiler-bug). Allerdings ist E ein benutzerdefinierter Typ, für den ADL greift und in Nexus' Beispiel handelt es sich nur um <code>int</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042345</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 30 Mar 2011 14:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Thu, 31 Mar 2011 11:22:04 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Antworten, die Erklärung klingt schon mal gut.</p>
<p>Eigentlich bin ich ja auf den Fehler gestossen, weil ich in einem Funktionstemplate ein <code>STATIC_ASSERT(false)</code> hatte, das unter MSVC nur beim Aufruf, bei g++ aber immer zu Compilerfehlern führte. Ausserdem hatte ich einen Fall, wo man als Benutzer für seine Typen eine freie Funktion bereitstellen muss, und ansonsten ein Default-Implementierung besteht. Wenn bei g++ letztere vor dem Aufruf deklariert wird, wird nur diese als Überladung berücksichtigt. Hm, vielleicht ist Code verständlicher... <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>
<pre><code class="language-cpp">// Default-Implementierung
template &lt;typename T&gt;
void UserFunction(T t);

// Bibliotheksklasse
template &lt;typename T&gt;
struct MyClass
{
    void DoSomething(T t)
    {
        // ruft bei g++ immer die Default-Implementierung auf - ausser diese
        // ist hier noch nicht sichtbar, dann normale Überladungsauflösung
        UserFunction(t);
    }
};

// Benutzerfunktion, für T = UserClass
void UserFunction(UserClass c);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2042728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042728</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 31 Mar 2011 11:22:04 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Mon, 04 Apr 2011 21:56:19 GMT]]></title><description><![CDATA[<p>Ich bin mir hier jetzt nicht 100% sicher und hoffe ich blamier mich nicht, aber wenn ich mich recht entsinne, und <a href="http://www.c-plusplus.net/forum/81033" rel="nofollow">http://www.c-plusplus.net/forum/81033</a> mir betrachte, tut der g++ dann nicht genau das richtige?</p>
<p>und mit</p>
<pre><code class="language-cpp">// Benutzerfunktion, für T = UserClass
template &lt;&gt;
void UserFunction&lt;UserClass&gt;(UserClass c);
</code></pre>
<p>hättest du beim Aufruf das gewünschte Ergebnis?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044755</guid><dc:creator><![CDATA[unsicherer]]></dc:creator><pubDate>Mon, 04 Apr 2011 21:56:19 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Mon, 04 Apr 2011 22:29:12 GMT]]></title><description><![CDATA[<p>unsicherer schrieb:</p>
<blockquote>
<p>Ich bin mir hier jetzt nicht 100% sicher und hoffe ich blamier mich nicht</p>
</blockquote>
<p>Keine Sorge, hier scheint sich niemand wirklich sicher zu sein <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>
<p>Geht es im verlinkten Thread nicht eher um Templatespezialisierungen? Denn das Beispiel hier hat ja damit nichts zu tun. Überhaupt mag ich Spezialisierungen von Funktionstemplates nicht und ziehe Überladungen eigentlich immer vor.</p>
<p>Ich hatte früher auch immer in Erinnerung, dass zumindest von Templateparametern abhängige Ausdrücke erst bei der Instanziierung kompiliert werden (d.h. für das Lookup werden auch die dort sichtbaren Namen verwendet). Würde ja um einiges mehr Sinn machen als bei der Definition. Ich muss bei Gelegenheit mal im Standard wühlen, fürchte aber, dass das wieder in eine Interpretiererei ausarten könnte...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044767</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 04 Apr 2011 22:29:12 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Tue, 05 Apr 2011 09:26:47 GMT]]></title><description><![CDATA[<p>Ich hab im Hinterkopf was von &quot;2-phase-lookup&quot;, soll heißen, dass die Namen in zwei Schritten zu unterschidelichen Zeiten nachgeschaut werden. IIRC macht das nur einer (oder garkeiner?) von beiden Compilern wirklich korrekt. Das stand vermutlich im Josuttis/Vandervoorde - hab ich aber grad nicht zur Hand, müsste zu Hause mal nachschlagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044823</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 05 Apr 2011 09:26:47 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Tue, 05 Apr 2011 10:15:16 GMT]]></title><description><![CDATA[<p>Wenn man die Reihenfolge von Template und der Ueberladung nicht mit anderen Templates mischt, dann liefert g++ auch <code>T</code> und <code>int</code> als Ausgabe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2044851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2044851</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 05 Apr 2011 10:15:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Wed, 24 Aug 2011 09:34:15 GMT]]></title><description><![CDATA[<p>gcc macht es richtig, msvc nicht:</p>
<blockquote>
<p>14.6.2/1<br />
...<br />
In an expression of<br />
the form:<br />
postfix-expression ( expression-listopt )<br />
where the postfix-expression is an identifier, the identifier denotes a dependent name if and only if any of<br />
the expressions in the expression-list is a type-dependent expression (14.6.2.2).</p>
</blockquote>
<p>In</p>
<pre><code class="language-cpp">Func(T());
</code></pre>
<p>sind sowohl T (14.6.2.1) als auch T() (14.6.2.2) type-dependent. Damit ist auch func ein abhängiger Name.</p>
<blockquote>
<p>14.6.4 Dependent name resolution [temp.dep.res]<br />
1 In resolving dependent names, names from the following sources are considered:<br />
— Declarations that are visible at the point of definition of the template.<br />
— Declarations from namespaces associated with the types of the function arguments both from the instantiation<br />
context (14.6.4.1) and from the definition context.</p>
</blockquote>
<p>Und damit ist alles klar. Bei der Definition des Templates ist nur das Funktionstemplate sichtbar. ADL im zweiten Schritt nützt auch nichts: <em>fundamentale Typen haben keinen assoziierten Namensraum</em>. Würde man in dem Code hingen das int durch eine entsprechende Klasse ersetzen, würde das vom OP wohl erwartete Verhalten herauskommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110003</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 24 Aug 2011 09:34:15 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Wed, 24 Aug 2011 09:50:16 GMT]]></title><description><![CDATA[<p>Vielen Dank für die nachträgliche Erklärung!</p>
<p>camper schrieb:</p>
<blockquote>
<p>Würde man in dem Code hingen das int durch eine entsprechende Klasse ersetzen, würde das vom OP wohl erwartete Verhalten herauskommen.</p>
</blockquote>
<p>Das ist ja wieder mal super-unintuitiv. Ich frage mich, was man mit der Sonderbehandlung von fundamentalen Typen hier bezweckt. Gerade falls man <code>typedef</code> s hat, kann sich bei einer Typänderung das Programmverhalten komplett ändern, ohne dass man zur Kompilierzeit was davon mitbekommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110017</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 24 Aug 2011 09:50:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Wed, 24 Aug 2011 10:13:07 GMT]]></title><description><![CDATA[<p>Habe gar nicht gemerkt, dass der Thread so alt ist. Der stand mitten zwischen den Anderen von heute. Komisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110035</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 24 Aug 2011 10:13:07 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Wed, 24 Aug 2011 10:17:18 GMT]]></title><description><![CDATA[<p>Kein Problem, im Gegenteil! Ich bin froh, dass das Ganze doch noch geklärt wurde <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>Auch wenn mir persönlich die Art, wie C++ das handhabt, nicht gefällt. Aber vielleicht übersehe ich auch die Intention hinter der &quot;Spezialbehandlung&quot; von fundamentalen Typen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110038</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 24 Aug 2011 10:17:18 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Wed, 24 Aug 2011 10:54:57 GMT]]></title><description><![CDATA[<p>Super ... ich hatte das schon wieder ganz vergessen, dass ich das nachgucken wollte. Wie gesagt, was name lookup angeht, vertraue ich eigentlich dem GCC mehr. Die Erklärungen überraschen mich also nicht. <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>Danke, camper.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110047</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 24 Aug 2011 10:54:57 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Wed, 24 Aug 2011 11:05:58 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Aber vielleicht übersehe ich auch die Intention hinter der &quot;Spezialbehandlung&quot; von fundamentalen Typen...</p>
</blockquote>
<p>Ich kann mir eigentlich nicht vorstellen, dass das eine gewollte Spezialbehandlung ist. Die Regeln sind doch so komplex, könnte sich sowas nicht einfach &quot;ergeben&quot;?</p>
<p>Und: Findet man solche versteckten Abstrusitäten in anderen Sprachen eigentlich auch? Oder ist das eine Kombi durch die heterogenen Compiler, das lange Regelwerk (insb. durch Templates?), den sorgsam ausformulierten Standard und das relativ hohe Niveau mancher Benutzer der Sprache?<br />
Ich kenne mich in anderen Programmiersprachen nicht so gut aus wie in C++, aber ich versuche mir grad eine ähnliche Diskussion zu Python- oder Java-Verhalten vorzustellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110052</guid><dc:creator><![CDATA[fdfdg]]></dc:creator><pubDate>Wed, 24 Aug 2011 11:05:58 GMT</pubDate></item><item><title><![CDATA[Reply to Zeitpunkt der Instanziierung von Templates on Wed, 24 Aug 2011 12:27:05 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Aber vielleicht übersehe ich auch die Intention hinter der &quot;Spezialbehandlung&quot; von fundamentalen Typen...</p>
</blockquote>
<p>Ich sehe da eigentlich keine Sonderbehandlung. Der assozierte Namensraum einer Entität ist derjenige Namensraum, in dem diese definiert wird (bzw. bei zusammengesetzten Typen, die Menge aller assozierten Namensräume, von denen sich der Typ ableitet). Fundamentale Typen können nicht definiert werden, folglich gibt es auch keinen assozierten Namensraum für sie. Was wäre denn die Alternative? der globale Namensraum? ::std? Der (überraschende Effekt) des nicht Gefundenwerdens ist ja trotzdem nicht nur auf fundamentale Typen beschränkt</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
struct Foo {};
template &lt;typename T&gt; void Func(T) { std::cout &lt;&lt; &quot;T&quot; &lt;&lt; std::endl; }
template &lt;typename T&gt; void Use() { Func(T()); }
void Func(int) { std::cout &lt;&lt; &quot;int&quot; &lt;&lt; std::endl; }
void Func(Foo) { std::cout &lt;&lt; &quot;Foo&quot; &lt;&lt; std::endl; }
template &lt;typename T&gt; void Func(T*) { std::cout &lt;&lt; &quot;T*&quot; &lt;&lt; std::endl; }
void Func(std::vector&lt;char&gt;*) { std::cout &lt;&lt; &quot;std::vector&lt;char&gt;*&quot; &lt;&lt; std::endl; }

int main()
{
    Use&lt;double&gt;(); // T
    Use&lt;int&gt;();    // T
    Use&lt;Foo&gt;();    // Foo
    Use&lt;Foo*&gt;();   // T*
    Use&lt;std::vector&lt;char&gt;&gt;();   // T   - Überladung müsste im Namensraum ::std stattfinden, was nat. nicht geht
    Use&lt;std::vector&lt;char&gt;*&gt;();  // T
    Use&lt;std::vector&lt;Foo&gt;*&gt;();  // T*
}
</code></pre>
<p>Man kann sicherlich über das Für und Wider des 2-Phasen-Lookups diskutieren. Damit kann man allerdings auch Bücher füllen <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="🙂"
    /><br />
Zusammenfassend: Überladung ist fast genauso böse wie Spezialisierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110065</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 24 Aug 2011 12:27:05 GMT</pubDate></item></channel></rss>