<?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[Frage zum Name-Lookup]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Frage zum Name-Lookup, bzw. ob/warum folgender Code falsch ist:</p>
<pre><code class="language-cpp">int f( int) { return int(); }

namespace N
{
  class A {};

  A g( int(*)(int), A) { return A(); }

  int h( int i){ return f(i); }

  A f( A a) { return g( f, a); } // compiliert nicht : cannot convert A(*)(A) to int(*)(int)
  A f( A a) { return g( h, a); } // compiliert

}
</code></pre>
<p>Tritt auch mit dem Comeau-Onlinecompiler so auf, von daher denke ich, dass es kein Artefakt meines Compilers ist (KAI C++).</p>
<p>Warum wird in ersterer Variante die global sichtbare Funktion f nicht berücksichtigt? Und wie kann ich dafür sorgen (möglichst ohne den Schritt über eine Stub-Funktion h), dass auch die global sichtbare Funktion f zur Überladungsauflösung herangezogen wird? Dabei ist anzumerken, dass ::f nicht verwendet werden kann, weil die Funktion u.U. aus einem anderen namespace kommt und nur per using global sichtbar ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/150116/frage-zum-name-lookup</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 12:03:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/150116.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Jun 2006 10:20:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zum Name-Lookup on Tue, 13 Jun 2006 10:20:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Frage zum Name-Lookup, bzw. ob/warum folgender Code falsch ist:</p>
<pre><code class="language-cpp">int f( int) { return int(); }

namespace N
{
  class A {};

  A g( int(*)(int), A) { return A(); }

  int h( int i){ return f(i); }

  A f( A a) { return g( f, a); } // compiliert nicht : cannot convert A(*)(A) to int(*)(int)
  A f( A a) { return g( h, a); } // compiliert

}
</code></pre>
<p>Tritt auch mit dem Comeau-Onlinecompiler so auf, von daher denke ich, dass es kein Artefakt meines Compilers ist (KAI C++).</p>
<p>Warum wird in ersterer Variante die global sichtbare Funktion f nicht berücksichtigt? Und wie kann ich dafür sorgen (möglichst ohne den Schritt über eine Stub-Funktion h), dass auch die global sichtbare Funktion f zur Überladungsauflösung herangezogen wird? Dabei ist anzumerken, dass ::f nicht verwendet werden kann, weil die Funktion u.U. aus einem anderen namespace kommt und nur per using global sichtbar ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076789</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Tue, 13 Jun 2006 10:20:17 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Name-Lookup on Tue, 13 Jun 2006 10:38:05 GMT]]></title><description><![CDATA[<p>Deine Funktion heisst doch schon f. Du erreichst die globale dann mit ::f.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076795</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 13 Jun 2006 10:38:05 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Name-Lookup on Tue, 13 Jun 2006 11:01:48 GMT]]></title><description><![CDATA[<p>7H3 N4C3R schrieb:</p>
<blockquote>
<p>Dabei ist anzumerken, dass ::f nicht verwendet werden kann, weil die Funktion u.U. aus einem anderen namespace kommt und nur per using global sichtbar ist.</p>
</blockquote>
<p><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>Ich weiß, dass die Funktion f heißt. Soll sie auch. Wieso wird die globale Funktion nicht zur Überladungsauflösung herangezogen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076811</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Tue, 13 Jun 2006 11:01:48 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Name-Lookup on Tue, 13 Jun 2006 11:43:47 GMT]]></title><description><![CDATA[<p>Weil es innerhalb eines Namespaces (auch für die Suche) nur ein f geben kann.<br />
Ansonsten gib doch den externen Namespace an (was du wahrscheinlich nicht willst?).</p>
<p>Und was passiert, wenn du</p>
<pre><code class="language-cpp">namespace N
{
  using ::f;  // &lt;- hier angeben

  ...
}
</code></pre>
<p>schreibst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076827</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 13 Jun 2006 11:43:47 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Name-Lookup on Tue, 13 Jun 2006 12:15:09 GMT]]></title><description><![CDATA[<p>Dann wird möglicherweise f nicht gefunden.</p>
<p>Das konkrete Problem ist, diverse mathematische Funktionen für Matrizen zu überladen - z.B. Matrix tan( Matrix). Je nach Compiler etc. steht tan aber mal im globalen Namensraum und mal in std:: mit einem using global sichtbar gemacht. Die Hauptmotivation ist Plattform-Unabhängigkeit. Das Programm muss jetzt schon unter 3 Plattformen (mit insgesamt 6 verschiedenen Compilern) laufen und es werden tendenziell mehr. Da ist eine Anpassung für jede Plattform einfach kontraproduktiv.</p>
<p>Wenn ich es also richtig verstehe, wird der globale Namensraum durchsucht, wenn im aktuellen Namensraum kein f gefunden werden konnte? Falls schon eines gefunden wurde, wird nicht gesucht? Hätte jemand vielleicht den entsprechenden Absatz im Standard parat? Ich bin zwar schon am Suchen, habe die passende Stelle aber noch nicht.</p>
<p>Edit: Letzteres habe ich selbst gefunden. 3.3.7 Clause 1</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076836</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Tue, 13 Jun 2006 12:15:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Name-Lookup on Tue, 13 Jun 2006 12:44:08 GMT]]></title><description><![CDATA[<p>So, nach etwas rätseln habe ich dann die Lösung gefunden - u.a. auch dafür, dass ich z.B. tan auch nicht mit ::tan referenzieren konnte (abgesehen vom Namespace-Lookup-Problem).</p>
<pre><code class="language-cpp">typedef extern &quot;C&quot; { int (* Foo)( int); }
</code></pre>
<p>und</p>
<pre><code class="language-cpp">typedef int(* Bar)( int);
</code></pre>
<p>sind verschiedene Typen, die nicht zueinander kompatibel sind (und auf einem standardkonformen Compiler auch nicht implizit ineinander konvertierbar). tan kann wohl auch extern &quot;C&quot; sein. Lösung ist, eine zusätzliche Funktion A g(Foo, A) bereitzustellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076858</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Tue, 13 Jun 2006 12:44:08 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Name-Lookup on Tue, 13 Jun 2006 13:22:50 GMT]]></title><description><![CDATA[<p>7H3 N4C3R schrieb:</p>
<blockquote>
<p>Wenn ich es also richtig verstehe, wird der globale Namensraum durchsucht, wenn im aktuellen Namensraum kein f gefunden werden konnte? Falls schon eines gefunden wurde, wird nicht gesucht? Hätte jemand vielleicht den entsprechenden Absatz im Standard parat? Ich bin zwar schon am Suchen, habe die passende Stelle aber noch nicht.</p>
<p>Edit: Letzteres habe ich selbst gefunden. 3.3.7 Clause 1</p>
</blockquote>
<p>am besten dürfte 3.4.1/1 i.V.m. 3.4.1/6 (mit beispiel) passen.</p>
<blockquote>
<p>Das konkrete Problem ist, diverse mathematische Funktionen für Matrizen zu überladen - z.B. Matrix tan( Matrix).</p>
</blockquote>
<p>hier bietet sich ADL an (Koenig-Lookup).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076878</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 13 Jun 2006 13:22:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum Name-Lookup on Tue, 13 Jun 2006 13:32:13 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>am besten dürfte 3.4.1/1 i.V.m. 3.4.1/6 (mit beispiel) passen.</p>
<p>hier bietet sich ADL an (Koenig-Lookup).</p>
</blockquote>
<p>Danke. <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="🙂"
    /> Werde mir letzteres mal genauer anschauen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1076883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1076883</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Tue, 13 Jun 2006 13:32:13 GMT</pubDate></item></channel></rss>