<?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[operator+ als Parameter [solved]]]></title><description><![CDATA[<p>Die Klasse Matrix&lt;T&gt; hat u.a. die folgende Methode:</p>
<pre><code class="language-cpp">T fold(T (*func) (T, T), T begin) const;
</code></pre>
<p>Angenommen ich hab nun ein Matrix&lt;double&gt;-Objekt m und möchte sowas hier aufrufen:</p>
<pre><code class="language-cpp">double d = m.fold(operator+, 0.0);
</code></pre>
<p>Es kommt die folgende Fehlermeldung:</p>
<pre><code>..\src\LinearAlgebra.cpp:121:23: Fehler: keine passende Funktion für Aufruf von »Matrix&lt;double&gt;::fold(&lt;unresolved overloaded function type&gt;, double)«
..\src\LinearAlgebra.cpp:121:23: Anmerkung: Kandidaten sind:
In file included from ..\src\LinearAlgebra.cpp:6:0:
..\src\matrix.h:171:5: Anmerkung: T Matrix&lt;T&gt;::fold(T (*)(T, T), T) const [with T = double]
..\src\matrix.h:171:5: Anmerkung:   keine bekannte Umwandlung für Argument 1 von »&lt;unresolved overloaded function type&gt;« nach »double (*)(double, double)«
</code></pre>
<p>Kann man sowas wie operator+ einfach nicht als Parameter übergeben? Oder hat der operator+ für double einfach einen anderen Typ als ich denke?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/312268/operator-als-parameter-solved</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 22:59:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312268.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 30 Dec 2012 19:19:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator+ als Parameter [solved] on Sun, 30 Dec 2012 22:48:46 GMT]]></title><description><![CDATA[<p>Die Klasse Matrix&lt;T&gt; hat u.a. die folgende Methode:</p>
<pre><code class="language-cpp">T fold(T (*func) (T, T), T begin) const;
</code></pre>
<p>Angenommen ich hab nun ein Matrix&lt;double&gt;-Objekt m und möchte sowas hier aufrufen:</p>
<pre><code class="language-cpp">double d = m.fold(operator+, 0.0);
</code></pre>
<p>Es kommt die folgende Fehlermeldung:</p>
<pre><code>..\src\LinearAlgebra.cpp:121:23: Fehler: keine passende Funktion für Aufruf von »Matrix&lt;double&gt;::fold(&lt;unresolved overloaded function type&gt;, double)«
..\src\LinearAlgebra.cpp:121:23: Anmerkung: Kandidaten sind:
In file included from ..\src\LinearAlgebra.cpp:6:0:
..\src\matrix.h:171:5: Anmerkung: T Matrix&lt;T&gt;::fold(T (*)(T, T), T) const [with T = double]
..\src\matrix.h:171:5: Anmerkung:   keine bekannte Umwandlung für Argument 1 von »&lt;unresolved overloaded function type&gt;« nach »double (*)(double, double)«
</code></pre>
<p>Kann man sowas wie operator+ einfach nicht als Parameter übergeben? Oder hat der operator+ für double einfach einen anderen Typ als ich denke?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284567</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sun, 30 Dec 2012 22:48:46 GMT</pubDate></item><item><title><![CDATA[Reply to operator+ als Parameter [solved] on Sun, 30 Dec 2012 19:31:01 GMT]]></title><description><![CDATA[<p>Der operator+ existiert für viele verschiedene Typen. Damit du eine bestimmte Überladung auswählen kannst, kannst du z.B. folgendes schreiben:</p>
<pre><code class="language-cpp">auto double_add_operator = static_cast&lt;double(double, double)&gt;(operator+);
</code></pre>
<p>Allerdings kann es sein, dass das mit Operatoren für eingebaute Typen nicht funktioniert, weil sie keine richtige Implementierung besitzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284572</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sun, 30 Dec 2012 19:31:01 GMT</pubDate></item><item><title><![CDATA[Reply to operator+ als Parameter [solved] on Sun, 30 Dec 2012 19:33:54 GMT]]></title><description><![CDATA[<p>Der eingebaute Operator ist keine Funktion.</p>
<p>Eine bessere Wahl wäre so etwas wie</p>
<pre><code class="language-cpp">template &lt;typename F&gt;
T fold(F func, T begin) const;
</code></pre>
<p>Dann funktioniert auch std::multiplies&lt;T&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284573</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 30 Dec 2012 19:33:54 GMT</pubDate></item><item><title><![CDATA[Reply to operator+ als Parameter [solved] on Sun, 30 Dec 2012 19:35:53 GMT]]></title><description><![CDATA[<pre><code>double d = m.fold([] (double a, double b) { return a + b; }, 0.0);
// oder
double d = m.fold(std::plus&lt;double&gt;, 0.0);
</code></pre>
<p>Edit: Ja, Funktionspointer ist natürlich Quatsch. Siehe camper.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284574</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 30 Dec 2012 19:35:53 GMT</pubDate></item><item><title><![CDATA[Reply to operator+ als Parameter [solved] on Sun, 30 Dec 2012 22:03:11 GMT]]></title><description><![CDATA[<p>Danke für die Tipps.</p>
<p>Nur das hier:</p>
<pre><code class="language-cpp">double d = m.fold(std::plus&lt;double&gt;, 0.0);
</code></pre>
<p>funktioniert noch nicht:</p>
<pre><code>..\src\LinearAlgebra.cpp:121:30: Fehler: expected primary-expression before »,« token
</code></pre>
<p>Der Lambda-Ausdruck geht.</p>
<p>Edit:<br />
Ich habs schon, es muss heißen:</p>
<pre><code class="language-cpp">double d = m.fold(std::plus&lt;double&gt;(), 0.0);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2284604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284604</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sun, 30 Dec 2012 22:03:11 GMT</pubDate></item><item><title><![CDATA[Reply to operator+ als Parameter [solved] on Sun, 30 Dec 2012 22:03:43 GMT]]></title><description><![CDATA[<p>Eine Frage hab ich noch:</p>
<p>Vorher ging das hier:</p>
<pre><code class="language-cpp">m.fold(std::min, 0.0)
</code></pre>
<p>Jetzt nicht mehr, was ja auch logisch ist, da std::min nicht mehr eindeutig ist.<br />
Was wäre die eleganteste Lösung ohne C++11 (d.h. u.a. ohne Lambda-Ausdruck)?</p>
<p>Ich hätte jetzt gedacht, dass</p>
<pre><code class="language-cpp">m.fold(std::min&lt;double&gt;, 0.0)
</code></pre>
<p>funktionieren müsste, das tut es aber nicht:</p>
<pre><code>Fehler: keine passende Funktion für Aufruf von »Matrix&lt;double&gt;::fold(&lt;unresolved overloaded function type&gt;, double)«
</code></pre>
<p>Eine Lösung, die funktioniert, die ich aber nicht vollständig verstehe ich folgende:<br />
Matrix&lt;T&gt; hat das alte</p>
<pre><code class="language-cpp">T fold(T (*func) (T, T), T begin) const;
</code></pre>
<p>neben dem neuen</p>
<pre><code class="language-cpp">template &lt;class F&gt;
T fold(F func, T begin) const;
</code></pre>
<p>Prinzipiell könnte aber das F der zweiten fold-Methode doch gleich T(<em>)(T,T) sein oder? Das heißt, dass eine Methode mit dem gleichen Namen und den gleichen Parametern zweimal vorkommt. Oder wird einfach zunächst überprüft, ob T(</em>)(T,T) passt und falls nicht die zweite fold-Methode benutzt?</p>
<p>Wie würdet ihr das genannte Problem lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284613</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sun, 30 Dec 2012 22:03:43 GMT</pubDate></item><item><title><![CDATA[Reply to operator+ als Parameter [solved] on Sun, 30 Dec 2012 22:07:15 GMT]]></title><description><![CDATA[<p>Es wird zuerst die speziellere Überladung geprüft (also die mit T (T, T)) und wenn diese nicht passt, die andere Überladung verwendet. Der einzige Weg, den ich kenne, um die Überladung von std::min anzugeben, ist ein cast:</p>
<pre><code>static_cast&lt;double(double, double)&gt;(std::min)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2284615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284615</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sun, 30 Dec 2012 22:07:15 GMT</pubDate></item><item><title><![CDATA[Reply to operator+ als Parameter [solved] on Sun, 30 Dec 2012 22:17:41 GMT]]></title><description><![CDATA[<p>Ramanujan schrieb:</p>
<blockquote>
<p>Vorher ging das hier:</p>
<pre><code class="language-cpp">m.fold(std::min, 0.0)
</code></pre>
</blockquote>
<p>Ist dein T eine Referenz auf const?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284618</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 30 Dec 2012 22:17:41 GMT</pubDate></item><item><title><![CDATA[Reply to operator+ als Parameter [solved] on Sun, 30 Dec 2012 22:27:11 GMT]]></title><description><![CDATA[<p>Anstatt zwei fold()-Methoden zu deklarieren müsste es ja auch über Template-Spezialisierung gehen. Irgendwie bekomm ich das aber nicht hin. Mein Versuch sieht bisher so aus:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
template &lt;class F&gt;
T Matrix&lt;T&gt;::fold(F func, T erg) const {
	for (int i = 0; i &lt; dim1_; i++)
		for (int j = 0; j &lt; dim2_; j++)
			erg = func(erg, getEntry(i,j));
	return erg;
}

template &lt;class T&gt;
template &lt;&gt;  // hier Fehler: invalid explicit specialization before »&gt;« token
             //              einschließende Klassentemplates werden nicht explizit spezialisiert
T Matrix&lt;T&gt;::fold(T(*func)(T,T), T erg) const { // Fehler: Template-ID »fold&lt;&gt;« für »T Matrix&lt;T&gt;::fold(T (*)(T, T), T) const« passt zu keiner Templatedeklaration
	for (int i = 0; i &lt; dim1_; i++)
		for (int j = 0; j &lt; dim2_; j++)
			erg = func(erg, getEntry(i,j));
	return erg;
}
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>:<br />
T = double</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284620</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sun, 30 Dec 2012 22:27:11 GMT</pubDate></item><item><title><![CDATA[Reply to operator+ als Parameter [solved] on Sun, 30 Dec 2012 22:29:58 GMT]]></title><description><![CDATA[<p>Warum willst du die Funktion spezialisieren und nicht überladen?<br />
<a href="http://www.gotw.ca/publications/mill17.htm" rel="nofollow">http://www.gotw.ca/publications/mill17.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284621</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sun, 30 Dec 2012 22:29:58 GMT</pubDate></item><item><title><![CDATA[Reply to operator+ als Parameter [solved] on Sun, 30 Dec 2012 22:34:47 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>Warum willst du die Funktion spezialisieren und nicht überladen?</p>
</blockquote>
<p>Unwissenheit xD</p>
<p>Danke für den Link.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284622</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Sun, 30 Dec 2012 22:34:47 GMT</pubDate></item><item><title><![CDATA[Reply to operator+ als Parameter [solved] on Sun, 30 Dec 2012 23:12:20 GMT]]></title><description><![CDATA[<p>&lt;algorithm&gt; deklariert 4 min-Überladungen</p>
<pre><code class="language-cpp">template&lt;class T&gt; const T&amp; min(const T&amp; a, const T&amp; b);
template&lt;class T, class Compare&gt;
const T&amp; min(const T&amp; a, const T&amp; b, Compare comp);
template&lt;class T&gt;
T min(initializer_list&lt;T&gt; t);
template&lt;class T, class Compare&gt;
T min(initializer_list&lt;T&gt; t, Compare comp);
</code></pre>
<p>Deshalb reicht es nicht, den Templateparameter explizit anzugeben. Anderseits ist mir auch nicht ganz klar, wie daraus ein double(double,double) entsehen soll..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284638</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 30 Dec 2012 23:12:20 GMT</pubDate></item></channel></rss>