<?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[for_each]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe in meiner Klasse Worker eine map&lt;string, Work&gt; workers und damit der Benutzer von Worker irgend eine Operation auf alle Elemente Work der Map aufrufen kann, hab ich ihr eine forEach Methode spendiert:</p>
<pre><code class="language-cpp">template &lt;typename UnaryFunction&gt;
void Worker::forEachWork(UnaryFunction fn) {
	for(WorkMap::iterator it = workers.begin(); it != workers.end(); ++it)
		fn(it-&gt;second); 
}
</code></pre>
<p>1. Frage: Ist das eine gute Idee? Oder sollte ich lieber einen Iterator auf die map liefern?</p>
<p>2. Ich habe Probleme mit dem Aufruf. Meine Unaryfunction ist eine STATISCHE Methode, die so aussieht:</p>
<pre><code class="language-cpp">void EditorForm::setWorkInactive(Work* rt) {
	rt-&gt;setActive(false);
}
// Aufruf:
worker-&gt;forEachWork(EditorForm::setWorkInactive);
</code></pre>
<p>Das kompilert auch, nur kriege ich einen Linkerfehler (die Fehlermeldung is elendig lange und möchte ich euch ersparen).</p>
<p>Weiß wer wieso das nicht geht? Und wie es geht?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/247140/for_each</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 18:23:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/247140.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Aug 2009 14:14:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to for_each on Thu, 06 Aug 2009 14:14:34 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe in meiner Klasse Worker eine map&lt;string, Work&gt; workers und damit der Benutzer von Worker irgend eine Operation auf alle Elemente Work der Map aufrufen kann, hab ich ihr eine forEach Methode spendiert:</p>
<pre><code class="language-cpp">template &lt;typename UnaryFunction&gt;
void Worker::forEachWork(UnaryFunction fn) {
	for(WorkMap::iterator it = workers.begin(); it != workers.end(); ++it)
		fn(it-&gt;second); 
}
</code></pre>
<p>1. Frage: Ist das eine gute Idee? Oder sollte ich lieber einen Iterator auf die map liefern?</p>
<p>2. Ich habe Probleme mit dem Aufruf. Meine Unaryfunction ist eine STATISCHE Methode, die so aussieht:</p>
<pre><code class="language-cpp">void EditorForm::setWorkInactive(Work* rt) {
	rt-&gt;setActive(false);
}
// Aufruf:
worker-&gt;forEachWork(EditorForm::setWorkInactive);
</code></pre>
<p>Das kompilert auch, nur kriege ich einen Linkerfehler (die Fehlermeldung is elendig lange und möchte ich euch ersparen).</p>
<p>Weiß wer wieso das nicht geht? Und wie es geht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756412</guid><dc:creator><![CDATA[frager+]]></dc:creator><pubDate>Thu, 06 Aug 2009 14:14:34 GMT</pubDate></item><item><title><![CDATA[Reply to for_each on Thu, 06 Aug 2009 14:16:48 GMT]]></title><description><![CDATA[<blockquote>
<p>Das kompilert auch, nur kriege ich einen Linkerfehler (die Fehlermeldung is elendig lange und möchte ich euch ersparen).</p>
</blockquote>
<p>mach mal trotzdem, wenn man sich die meldung anguckt, sieht man, was falsch läuft - so seh ich auf einen blick nichts falsches...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756413</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 06 Aug 2009 14:16:48 GMT</pubDate></item><item><title><![CDATA[Reply to for_each on Thu, 06 Aug 2009 14:38:03 GMT]]></title><description><![CDATA[<p>Also, ich hab den Code jetzt geändert. Meine Unary function ist jetzt eine freie Funktion (sie macht in der Klasse EditorForm keinen Sinn):</p>
<pre><code class="language-cpp">void setWorkInactive(Work* w) {
	w-&gt;setActive(false);
}
// Aufruf:
worker-&gt;forEachWork(setWorkInactive);
</code></pre>
<p>Kompiliert einwandfrei, nur gibt wieder einen Linkerfehler. Den Linkerfehler möchte ich erstmal nicht posten (ist ein Firmenprojekt und da sollte ich eigentlich keine Namen posten. Meine Typnamen habe ich für diesen Thread alle umbenannt).<br />
Aber vielleicht weiß ja wer auch ohne Linkererror, wieso das nicht klappt?<br />
Ich hab setWorkInactive grade probiert mit std::for_each, und da klappt alles (kein Linkerfehler!) Wieso geht es bei meinem forEachWork nicht? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756424</guid><dc:creator><![CDATA[frager+]]></dc:creator><pubDate>Thu, 06 Aug 2009 14:38:03 GMT</pubDate></item><item><title><![CDATA[Reply to for_each on Thu, 06 Aug 2009 14:53:52 GMT]]></title><description><![CDATA[<p>Ich glaube ich konnte den Fehler eingrenzen. Ich glaube meine Template Methode forEachWork() ist falsch. Es ist eine Template Methode in einer NICHT-Template Klasse:</p>
<pre><code class="language-cpp">// .h
class Work {

template &lt;class UnaryFunction&gt;
void forEachWork();
};

//.cpp
template &lt;class UnaryFunction&gt;
void Work::forEachWork() {
}
</code></pre>
<p>Das stimmt nicht ganz, oder? Ich habs auch mit template &lt;class UnaryFunction&gt;<br />
void Work&lt;UnaryFunction&gt;::forEachWork() probiert, aber das gibt einen Compilerfehler. Ist meine Methode falsch definiert? Falls ja: Wie gehts richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756433</guid><dc:creator><![CDATA[frager+]]></dc:creator><pubDate>Thu, 06 Aug 2009 14:53:52 GMT</pubDate></item><item><title><![CDATA[Reply to for_each on Thu, 06 Aug 2009 15:42:31 GMT]]></title><description><![CDATA[<p>frager+ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// .h
class Work {

template &lt;class UnaryFunction&gt;
void forEachWork();
};

//.cpp
template &lt;class UnaryFunction&gt;
void Work::forEachWork() {
}
</code></pre>
<p>Das stimmt nicht ganz, oder?</p>
</blockquote>
<p>Richtig erkannt. Da die Definition des Funktions-Templates nur in der cpp-Datei steht, Du sie aber anderswo mit einem bestimmten UnaryFunction-Typ benutzen willst, kann der Compiler diese Funktion nicht erzeugen. Das, was in der cpp-Datei steht ist quasi nur eine Bauanleitung für die Funktion. Wenn Du die cpp-Datei kompilierst, erzeugt der Compiler keine forEachWork-Funktion.</p>
<p>Du kannst das Problem beheben, indem Du die Definition der Elementfunktion in die Header-Datei verlagerst.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756493</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Thu, 06 Aug 2009 15:42:31 GMT</pubDate></item><item><title><![CDATA[Reply to for_each on Thu, 06 Aug 2009 15:56:40 GMT]]></title><description><![CDATA[<p>Danke Sebastian <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1756504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1756504</guid><dc:creator><![CDATA[frager-]]></dc:creator><pubDate>Thu, 06 Aug 2009 15:56:40 GMT</pubDate></item></channel></rss>