<?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[Adresse eines überladenen Operators übergeben]]></title><description><![CDATA[<p>Hallo,<br />
ich wollte einfach mal aus Interesse eine Funktion wie unten schreiben, aber der GCC gibt mir einen Fehler aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt; T call(T (*func)(T, T), T number1, T number2)
{
    return func(number1, number2);
}

int main()
{
    std::cout &lt;&lt; call((double (*)(double, double))(operator+), 4.0, 3.1) &lt;&lt; std::endl;
}
</code></pre>
<p>Fehlermeldung:<br />
10:61: error: overloaded function with no contextual type information</p>
<p>Hat jemand eine Idee, wie man das lösen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277806/adresse-eines-überladenen-operators-übergeben</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 18:12:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277806.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Nov 2010 17:27:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Adresse eines überladenen Operators übergeben on Wed, 24 Nov 2010 17:27:42 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich wollte einfach mal aus Interesse eine Funktion wie unten schreiben, aber der GCC gibt mir einen Fehler aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt; T call(T (*func)(T, T), T number1, T number2)
{
    return func(number1, number2);
}

int main()
{
    std::cout &lt;&lt; call((double (*)(double, double))(operator+), 4.0, 3.1) &lt;&lt; std::endl;
}
</code></pre>
<p>Fehlermeldung:<br />
10:61: error: overloaded function with no contextual type information</p>
<p>Hat jemand eine Idee, wie man das lösen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985270</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Wed, 24 Nov 2010 17:27:42 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse eines überladenen Operators übergeben on Wed, 24 Nov 2010 18:24:48 GMT]]></title><description><![CDATA[<p><code>double</code> ist ein eingebauter Typ, und es wäre mir neu wenn die Operatoren für eingebaute Typen Funktionen wären. Und wenn sie keine Funktionen sind, kannst du dir auch die Adresse nicht holen.</p>
<p>Wenn es um eigene Typen geht, dann bekommst du die Adresse soweit ich weiss so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class foo {}; // eigener Typ

foo operator + (foo lhs, foo rhs) // operator + für foo
{
    return foo();
}

template&lt;typename T&gt; T call(T (*func)(T, T), T number1, T number2)
{
    return func(number1, number2);
}

int main()
{
    std::cout &lt;&lt; call(
            static_cast&lt;foo (*)(foo, foo)&gt;(&amp;operator +),
            foo(),
            foo()
        ) &lt;&lt; std::endl;
}
</code></pre>
<p>ADL funktioniert hier soweit ich weiss dann auch nicht mehr, d.h. wenn der <code>operator +</code> im selben Namespace wie <code>foo</code> definiert ist, und dieser Namespace gerade nicht &quot;in scope&quot; ist, dann wird der <code>operator +</code> nicht gefunden, weil eben kein ADL passiert. In dem Fall müsstest du <code>static_cast&lt;ns::foo (*)(ns::foo, ns::foo)&gt;(&amp;ns::operator +)</code> schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985298</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 24 Nov 2010 18:24:48 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse eines überladenen Operators übergeben on Wed, 24 Nov 2010 18:28:35 GMT]]></title><description><![CDATA[<p>Danke, ich habe mich auch schon gefragt, ob das geht. Ich hätte aber gedacht, wenn das nicht geht, käme eine etwas verständlichere Fehlermeldung <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1985299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985299</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Wed, 24 Nov 2010 18:28:35 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse eines überladenen Operators übergeben on Wed, 24 Nov 2010 18:37:11 GMT]]></title><description><![CDATA[<p>Versuch mal was du für ne Fehlermeldung vom GCC bekommst wenn du <code>static_cast</code> verwendest.</p>
<p>MSVC spuckt übrigens das aus (egal ob mit <code>static_cast</code> oder Pfui-Cast):</p>
<pre><code>1&gt;UndisclosedFilename.cpp(123) : error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'double (__cdecl *)(double,double)'
1&gt;        None of the functions with this name in scope match the target type
</code></pre>
<p>IMO schon besser verständlich als die GCC Fehlermeldung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985306</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 24 Nov 2010 18:37:11 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse eines überladenen Operators übergeben on Wed, 24 Nov 2010 18:39:08 GMT]]></title><description><![CDATA[<p>Bei static_cast kommt so etwas ähnliches wie bei dir:<br />
invalid static_cast from type '&lt;unresolved overloaded function type&gt;' to type 'double (*)(double, double)'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985307</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Wed, 24 Nov 2010 18:39:08 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse eines überladenen Operators übergeben on Wed, 24 Nov 2010 18:49:07 GMT]]></title><description><![CDATA[<p>Wenn es dir nichts ausmacht, std::tr1::function (bzw. boost::function) zu verwenden - übrigens sowieso besser - dann sieht das so aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;tr1/functional&gt;

template&lt;typename T&gt; T call(std::tr1::function&lt;T(T,T)&gt; func, T number1, T number2)
{
  return func(number1, number2);
}

int main()
{
  std::cout &lt;&lt; call(std::tr1::function&lt;double(double,double)&gt;(std::plus&lt;double&gt;()), 4.0, 3.1) &lt;&lt; std::endl;
}
</code></pre>
<p>Mit der normalen <code>std::binary_function</code> ist sowas nicht möglich, mit Funktionspointern brauchst du eine Funktion. IMHO die einzige Möglichkeit, deinen jetzigen Code zu behalten ist selber eine Funktion add zu schreiben, die die doubles selbst addiert.</p>
<pre><code class="language-cpp">template&lt;typename T&gt; T add(T a, T b) { return a+b; }
...
call(&amp;add&lt;double&gt;, 4.0, 3.1)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1985311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985311</guid><dc:creator><![CDATA[funktionär]]></dc:creator><pubDate>Wed, 24 Nov 2010 18:49:07 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse eines überladenen Operators übergeben on Wed, 24 Nov 2010 18:51:06 GMT]]></title><description><![CDATA[<p>funktionär schrieb:</p>
<blockquote>
<p>IMHO die einzige Möglichkeit, deinen jetzigen Code zu behalten ist selber eine Funktion add zu schreiben, die die doubles selbst addiert.</p>
</blockquote>
<p>Ja, denke ich auch. Ist nicht weiter schlimm, ich wollte es ja nur einmal ausprobieren.<br />
Danke allen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985312</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Wed, 24 Nov 2010 18:51:06 GMT</pubDate></item><item><title><![CDATA[Reply to Adresse eines überladenen Operators übergeben on Wed, 24 Nov 2010 23:26:59 GMT]]></title><description><![CDATA[<p>funktionär schrieb:</p>
<blockquote>
<p>Wenn es dir nichts ausmacht, std::tr1::function (bzw. boost::function) zu verwenden - übrigens sowieso besser - dann sieht das so aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;tr1/functional&gt;

template&lt;typename T&gt; T call(std::tr1::function&lt;T(T,T)&gt; func, T number1, T number2)
{
  return func(number1, number2);
}

int main()
{
  std::cout &lt;&lt; call(std::tr1::function&lt;double(double,double)&gt;(std::plus&lt;double&gt;()), 4.0, 3.1) &lt;&lt; std::endl;
}
</code></pre>
</blockquote>
<p>Wozu <code>tr1::function</code> ?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template &lt;class T, class F&gt;
T call(F func, T number1, T number2)
{
  return func(number1, number2);
}

int main()
{
  std::cout &lt;&lt; call(std::plus&lt;double&gt;(), 4.0, 3.1) &lt;&lt; std::endl;
}
</code></pre>
<p>Nur dass <code>std::plus</code> halt nicht <code>operator +</code> ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985423</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 24 Nov 2010 23:26:59 GMT</pubDate></item></channel></rss>