<?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[Namespace aus ADL Lookup entfernen?]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgendes Problem:</p>
<pre><code>namespace A{//kann ich nicht ändern
    class Foo(){};

    void doSomething(Foo const&amp; foo);//eine Funktion die nicht macht, was ich will.

};

namespace B{//kann ich nicht ändern
    template&lt;class T&gt;
    void doSomething(T const&amp; t);//die Funktion die macht, was ich will
};

namespace C{//kann ich ändern
    class Foo2:public Foo(){};//Ich muss von Foo erben.
};

namespace D{//kann ich nicht ändern
    class Foo3(){};

    void doSomething(Foo3 const&amp; foo);//muss via ADL gefunden werden

};

template&lt;class T&gt;
int myFunction(T const&amp; t){
    using B::doSomething;//enable lookup of B::doSomthing via ADL
    doSomething(t);
};

D::Foo3 a;
C::Foo2 b;
doSomething(a);//funktioniert
doSomething(b);//ruft A::doSomething auf :(
</code></pre>
<p>Kann ich verhindern, dass nach A::doSomething gesucht wird? Ich bin hier gerade Opfer von suboptimalen Library design (boost::begin vs boost::fusion::begin )</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/310964/namespace-aus-adl-lookup-entfernen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 05:35:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310964.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 Nov 2012 13:54:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Namespace aus ADL Lookup entfernen? on Fri, 23 Nov 2012 13:54:35 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgendes Problem:</p>
<pre><code>namespace A{//kann ich nicht ändern
    class Foo(){};

    void doSomething(Foo const&amp; foo);//eine Funktion die nicht macht, was ich will.

};

namespace B{//kann ich nicht ändern
    template&lt;class T&gt;
    void doSomething(T const&amp; t);//die Funktion die macht, was ich will
};

namespace C{//kann ich ändern
    class Foo2:public Foo(){};//Ich muss von Foo erben.
};

namespace D{//kann ich nicht ändern
    class Foo3(){};

    void doSomething(Foo3 const&amp; foo);//muss via ADL gefunden werden

};

template&lt;class T&gt;
int myFunction(T const&amp; t){
    using B::doSomething;//enable lookup of B::doSomthing via ADL
    doSomething(t);
};

D::Foo3 a;
C::Foo2 b;
doSomething(a);//funktioniert
doSomething(b);//ruft A::doSomething auf :(
</code></pre>
<p>Kann ich verhindern, dass nach A::doSomething gesucht wird? Ich bin hier gerade Opfer von suboptimalen Library design (boost::begin vs boost::fusion::begin )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273871</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Fri, 23 Nov 2012 13:54:35 GMT</pubDate></item><item><title><![CDATA[Reply to Namespace aus ADL Lookup entfernen? on Fri, 23 Nov 2012 14:02:12 GMT]]></title><description><![CDATA[<p>Aufruf qualifizieren?<br />
Ansonsten bitte kompilierbaren Code posten, damit man das Problem nachvollziehen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273873</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Fri, 23 Nov 2012 14:02:12 GMT</pubDate></item><item><title><![CDATA[Reply to Namespace aus ADL Lookup entfernen? on Fri, 23 Nov 2012 14:07:10 GMT]]></title><description><![CDATA[<p>Na ja, du kannst in C doSomething überladen, das sollte dann bevorzugt werden, dann musst du nur einmal B:: schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273878</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 23 Nov 2012 14:07:10 GMT</pubDate></item><item><title><![CDATA[Reply to Namespace aus ADL Lookup entfernen? on Fri, 23 Nov 2012 16:18:15 GMT]]></title><description><![CDATA[<p>Ich glaube, ein Kommentar ist falsch:</p>
<p>otze schrieb:</p>
<blockquote>
<pre><code>namespace A{//kann ich nicht ändern
    class Foo(){};

    void doSomething(Foo const&amp; foo);//eine Funktion die nicht macht, was ich will.

};

namespace B{//kann ich nicht ändern
    template&lt;class T&gt;
    void doSomething(T const&amp; t);//die Funktion die macht, was ich will
};

namespace C{//kann ich ändern
    class Foo2:public Foo(){};//Ich muss von Foo erben.
};

namespace D{//kann ich nicht ändern
    class Foo3(){};

    void doSomething(Foo3 const&amp; foo);//muss via ADL gefunden werden

};

template&lt;class T&gt;
int myFunction(T const&amp; t){
    using B::doSomething;//enable lookup of B::doSomthing via ADL
    doSomething(t);
};
</code></pre>
</blockquote>
<p>Ich denke, das sollte heißen</p>
<pre><code>template&lt;class T&gt;
int myFunction(T const&amp; t){
    using B::doSomething; // Using-Deklaration von B::doSomthing
    doSomething(t);       // unqualifiziert, damit auch
                          // D::doSomething per ADL gefunden wird
};
</code></pre>
<p>denn B::doSomething kann nie per ADL gefunden werden, weil in B gar kein benutzerdefinierter Typ definiert wurde.</p>
<p>otze schrieb:</p>
<blockquote>
<pre><code>D::Foo3 a;
C::Foo2 b;
doSomething(a);//funktioniert
doSomething(b);//ruft A::doSomething auf :(
</code></pre>
<p>Kann ich verhindern, dass nach A::doSomething gesucht wird? Ich bin hier gerade Opfer von suboptimalen Library design (boost::begin vs boost::fusion::begin )</p>
</blockquote>
<p>Hmmm... komisch. Ich hätte gedacht, dass B::doSomething im zweiten Fall ein besserer Match als A::doSomething wäre. Da ist ja immerhin eine Foo2*-&gt;Foo* Konvertierung bei.</p>
<p>Und sonst: siehe cooky451s Beitrag.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273913</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 23 Nov 2012 16:18:15 GMT</pubDate></item><item><title><![CDATA[Reply to Namespace aus ADL Lookup entfernen? on Fri, 23 Nov 2012 16:51:08 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Ich denke, das sollte heißen</p>
<pre><code>template&lt;class T&gt;
int myFunction(T const&amp; t){
    using B::doSomething; // Using-Deklaration von B::doSomthing
    doSomething(t);       // unqualifiziert, damit auch
                          // D::doSomething per ADL gefunden wird
};
</code></pre>
<p>denn B::doSomething kann nie per ADL gefunden werden, weil in B gar kein benutzerdefinierter Typ definiert wurde.</p>
</blockquote>
<p>korrekt. Allerdings wird B::doSomething so über normales unqualifiziertes Lookup gefunden.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>otze schrieb:</p>
<blockquote>
<pre><code>D::Foo3 a;
C::Foo2 b;
doSomething(a);//funktioniert
doSomething(b);//ruft A::doSomething auf :(
</code></pre>
<p>Kann ich verhindern, dass nach A::doSomething gesucht wird? Ich bin hier gerade Opfer von suboptimalen Library design (boost::begin vs boost::fusion::begin )</p>
</blockquote>
<p>Hmmm... komisch. Ich hätte gedacht, dass B::doSomething im zweiten Fall ein besserer Match als A::doSomething wäre. Da ist ja immerhin eine Foo2*-&gt;Foo* Konvertierung bei.</p>
<p>Und sonst: siehe cooky451s Beitrag.</p>
</blockquote>
<p>B::doSomething kann ja gerade nicht gefunden werden, weil B kein assoziierter Namensraum ist (s.o.).</p>
<p>Eine using-Deklaration in C sollte helfen.</p>
<pre><code class="language-cpp">namespace C{
    using ::B::doSomething;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2273933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273933</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 23 Nov 2012 16:51:08 GMT</pubDate></item><item><title><![CDATA[Reply to Namespace aus ADL Lookup entfernen? on Fri, 23 Nov 2012 17:11:30 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>B::doSomething kann ja gerade nicht gefunden werden, weil B kein assoziierter Namensraum ist (s.o.).</p>
</blockquote>
<p>Upps. Ich habe den Code im falschen Kontext betrachtet. Hatte immer noch diese using-Deklaration im Kopf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2273943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2273943</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 23 Nov 2012 17:11:30 GMT</pubDate></item></channel></rss>