<?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[Overload resolution in Template Funktion]]></title><description><![CDATA[<p>Hallo</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

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

template&lt;typename A&gt;
void foo(A)
{
	bar(A());
}

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

int main()
{
	foo(0);
	bar(0);
}
</code></pre>
<p>Kompiliert mit GCC 4.x wird mir</p>
<pre><code>test(T)
test(int)
</code></pre>
<p>ausgegeben.<br />
Wieso ist das so? bar ist ein abhängiger Name, daher sollte der Lookup in foo erst zu Instantiierungs-Zeit erfolgen. Zu dieser Zeit ist aber bar(int) die Beste Möglichkeit?!</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/265533/overload-resolution-in-template-funktion</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 00:34:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/265533.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 24 Apr 2010 19:42:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Overload resolution in Template Funktion on Sat, 24 Apr 2010 19:42:39 GMT]]></title><description><![CDATA[<p>Hallo</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

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

template&lt;typename A&gt;
void foo(A)
{
	bar(A());
}

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

int main()
{
	foo(0);
	bar(0);
}
</code></pre>
<p>Kompiliert mit GCC 4.x wird mir</p>
<pre><code>test(T)
test(int)
</code></pre>
<p>ausgegeben.<br />
Wieso ist das so? bar ist ein abhängiger Name, daher sollte der Lookup in foo erst zu Instantiierungs-Zeit erfolgen. Zu dieser Zeit ist aber bar(int) die Beste Möglichkeit?!</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1887803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1887803</guid><dc:creator><![CDATA[DummWieBrot]]></dc:creator><pubDate>Sat, 24 Apr 2010 19:42:39 GMT</pubDate></item><item><title><![CDATA[Reply to Overload resolution in Template Funktion on Sat, 24 Apr 2010 21:29:21 GMT]]></title><description><![CDATA[<p>Probiere mal folgenden Code, er könnte die Antwort liefern, welcher Typ erkannt wird:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;typeinfo&gt;
using namespace std; 

template&lt;typename T&gt; 
void bar(T) 
{ 
  std::cout &lt;&lt; &quot;test(&quot; &lt;&lt; typeid(T).name() &lt;&lt; &quot;)&quot; &lt;&lt; std::endl; 
} 

int main(int argc, char* argv[]) 
{
  bar(0); 
  return 0;
}
</code></pre>
<p>Unter meinem MSVC ist &quot;0&quot; ohne anderes Zutun ein int und die Ausgabe entspricht deiner Erwartung (also 2 mal &quot;test(int)&quot;). Das erinnert mich an die <a href="http://channel9.msdn.com/shows/Going+Deep/Stephan-T-Lavavej-Everything-you-ever-wanted-to-know-about-nullptr/" rel="nofollow">NULL - nullptr Debatte</a>. Ich bin gespannt welcher Typ für bar(0) bei deinem Compiler rauskommt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /> ...</p>
<p>lg XOR <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1887857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1887857</guid><dc:creator><![CDATA[xor]]></dc:creator><pubDate>Sat, 24 Apr 2010 21:29:21 GMT</pubDate></item><item><title><![CDATA[Reply to Overload resolution in Template Funktion on Sat, 24 Apr 2010 21:32:49 GMT]]></title><description><![CDATA[<p>xor schrieb:</p>
<blockquote>
<p>Probiere mal folgenden Code, er könnte die Antwort liefern, welcher Typ erkannt wird:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;typeinfo&gt;
using namespace std; 

template&lt;typename T&gt; 
void bar(T) 
{ 
  std::cout &lt;&lt; &quot;test(&quot; &lt;&lt; typeid(T).name() &lt;&lt; &quot;)&quot; &lt;&lt; std::endl; 
} 

int main(int argc, char* argv[]) 
{
  bar(0); 
  return 0;
}
</code></pre>
<p>Unter meinem MSVC ist &quot;0&quot; ohne anderes Zutun ein int und die Ausgabe entspricht deiner Erwartung (also 2 mal &quot;test(int)&quot;). Das erinnert mich an die <a href="http://channel9.msdn.com/shows/Going+Deep/Stephan-T-Lavavej-Everything-you-ever-wanted-to-know-about-nullptr/" rel="nofollow">NULL - nullptr Debatte</a>. Ich bin gespannt welcher Typ für bar(0) bei deinem Compiler rauskommt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /> ...</p>
<p>lg XOR <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>
</blockquote>
<p>Ich habe leider kein GCC gerade hier, daher kann ich nicht testen. Der Typ ist aber definitiv int, denn ein</p>
<pre><code class="language-cpp">template&lt;&gt;
void bar(int)
{
    std::cout &lt;&lt; &quot;test(int)&quot; &lt;&lt; std::endl;
}
</code></pre>
<p>funktioniert wunderbar, es wird zwei mal test(int) ausgegeben. Mm. nach muss es aber eben auch ohne Spezialisierung funktionieren, ein einfaches Überladen sollte auch gehen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1887860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1887860</guid><dc:creator><![CDATA[DummWieBrot]]></dc:creator><pubDate>Sat, 24 Apr 2010 21:32:49 GMT</pubDate></item><item><title><![CDATA[Reply to Overload resolution in Template Funktion on Sat, 24 Apr 2010 21:36:56 GMT]]></title><description><![CDATA[<p>DummWieBrot schrieb:</p>
<blockquote>
<p>funktioniert wunderbar, es wird zwei mal test(int) ausgegeben. Mm. nach muss es aber eben auch ohne Spezialisierung funktionieren, ein einfaches Überladen sollte auch gehen!</p>
</blockquote>
<p>aus der main wird ja auch das &quot;richtige&quot; bar aufgerufen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1887863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1887863</guid><dc:creator><![CDATA[DummWieBrot]]></dc:creator><pubDate>Sat, 24 Apr 2010 21:36:56 GMT</pubDate></item><item><title><![CDATA[Reply to Overload resolution in Template Funktion on Sat, 24 Apr 2010 21:58:50 GMT]]></title><description><![CDATA[<p>DummWieBrot schrieb:</p>
<blockquote>
<p>bar ist ein abhängiger Name, daher sollte der Lookup in foo erst zu Instantiierungs-Zeit erfolgen. Zu dieser Zeit ist aber bar(int) die Beste Möglichkeit?!</p>
</blockquote>
<p>Beim unqualifizierten Lookup wird nur das Template gefunden, denn dieses Lookup erfolgt im Kontext der Templatedefinition.<br />
bar(int) könnte höchtens durch ADL gefunden werden,allerdings hat int keinen assozierten Namensraum.</p>
<p>Das unqualifizierte Lookup muss bereits bei der Templatedefinition erfolgen, um den Ausdruck überhaupt interpretieren zu können.</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
void foo();
namespace x
{
    namespace y
    {
        template&lt;typename T&gt;
        void bar()
        {
            foo(T()); // unqualifiziertes lookup findet ::foo und nicht x::foo
                      // nur deshalb ist das überhaupt erst ein Funktionsaufruf
        }
    }
    struct foo
    {
        foo(int);
    };
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1887871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1887871</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 24 Apr 2010 21:58:50 GMT</pubDate></item><item><title><![CDATA[Reply to Overload resolution in Template Funktion on Sat, 24 Apr 2010 22:10:52 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>,<br />
Aber irgendwas scheint da trotzdem schief zu sein. Wenn du mal im Standard 14882:2003 schaust, Kapitel 14.6, Absatz 9, dann findest du dieses Beispiel:</p>
<pre><code class="language-cpp">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
}

void f(int);
double dd;

void h()
{
    g(2);   //will cause one call of f(char)followed
            // by two calls of f(int)
    g('a'); //will cause three calls of f(char)
}
</code></pre>
<p>Ich habe das mal ein wenig umgeschrieben und ausgeführt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void f(char) { std::cout &lt;&lt; &quot;f(char)&quot; &lt;&lt; std::endl; }

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
}

void f(int) { std::cout &lt;&lt; &quot;f(int)&quot; &lt;&lt; std::endl; };
//double dd;

int main()
{
    g(2);   //will cause one call of f(char)followed
            // by two calls of f(int)
    g('a'); //will cause three calls of f(char)
}
</code></pre>
<p>Das Resultat war:</p>
<pre><code>f(char)
f(char)
f(char)
f(char)
f(char)
f(char)
</code></pre>
<p>Das stimmt doch nach Standard nicht?</p>
<p>Version ist übrigens:<br />
g++ (TDM-2 mingw32) 4.4.1</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1887873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1887873</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 24 Apr 2010 22:10:52 GMT</pubDate></item><item><title><![CDATA[Reply to Overload resolution in Template Funktion on Sat, 24 Apr 2010 22:22:57 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>DummWieBrot schrieb:</p>
<blockquote>
<p>bar ist ein abhängiger Name, daher sollte der Lookup in foo erst zu Instantiierungs-Zeit erfolgen. Zu dieser Zeit ist aber bar(int) die Beste Möglichkeit?!</p>
</blockquote>
<p>Beim unqualifizierten Lookup wird nur das Template gefunden, denn dieses Lookup erfolgt im Kontext der Templatedefinition.<br />
bar(int) könnte höchtens durch ADL gefunden werden,allerdings hat int keinen assozierten Namensraum.</p>
<p>Das unqualifizierte Lookup muss bereits bei der Templatedefinition erfolgen, um den Ausdruck überhaupt interpretieren zu können.</p>
</blockquote>
<p>Nein. Dadurch, dass zum Zeitpunkt des Parsens von foo im gleichen Namespace kein Typ namens bar definiert ist, und foo selber nicht qualifiziert ist (::foo(T()) wär' was anderes!), ist klar, dass ein Funktionsaufruf gemeint ist. Welche Funktion wird definitiv durch ADL gemacht, und bei int wird zwangsläufig im global namespace geschaut!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1887878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1887878</guid><dc:creator><![CDATA[DummWieBrot]]></dc:creator><pubDate>Sat, 24 Apr 2010 22:22:57 GMT</pubDate></item><item><title><![CDATA[Reply to Overload resolution in Template Funktion on Sat, 24 Apr 2010 22:26:53 GMT]]></title><description><![CDATA[<p><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#197" rel="nofollow">Issues with two-stage lookup of dependent names</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1887880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1887880</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 24 Apr 2010 22:26:53 GMT</pubDate></item><item><title><![CDATA[Reply to Overload resolution in Template Funktion on Sat, 24 Apr 2010 22:30:14 GMT]]></title><description><![CDATA[<p>Argh, ich habs verstanden. Danke camper, danke Dravere!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1887881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1887881</guid><dc:creator><![CDATA[DummWieBrot]]></dc:creator><pubDate>Sat, 24 Apr 2010 22:30:14 GMT</pubDate></item><item><title><![CDATA[Reply to Overload resolution in Template Funktion on Sat, 24 Apr 2010 22:40:05 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#197" rel="nofollow">Issues with two-stage lookup of dependent names</a></p>
</blockquote>
<p>Danke für den Link!<br />
camper irrt nie, sogar wenn es ein Beispiel im Standard gibt, dann liegt nicht camper falsch sondern der Standard ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> <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>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1887886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1887886</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 24 Apr 2010 22:40:05 GMT</pubDate></item></channel></rss>