<?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[Funktionsobjekt und for_each]]></title><description><![CDATA[<p>Folgender Code wird von MinGW und BCC nicht kompiliert:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;functional&gt;
#include &lt;vector&gt;

using namespace std;

struct transferitem_t
{
    unsigned dst;

    transferitem_t (void) : dst (0) {}
};

std::vector &lt;transferitem_t&gt; ti (5);

void doSomething (void)
{
    class ConditionalAdd : public unary_function &lt;void, transferitem_t&amp;&gt;
    {
    private:
        unsigned i, sz;
    public:
        ConditionalAdd (void)
        {}
        ConditionalAdd (unsigned i_, unsigned sz_)
         : i (i_), sz (sz_) {}
        ConditionalAdd (const ConditionalAdd&amp; obj)
         : i (obj.i), sz (obj.sz) {}
        void operator () (transferitem_t&amp; ti) const
        {
            if (ti.dst &gt; i)
                ti.dst += sz;
        }
    };

    for_each (ti.begin (), ti.end (), ConditionalAdd (1, 2));
}
</code></pre>
<p>Die Fehlermeldungen lauten:</p>
<p>MinGW 3.4.2 schrieb:</p>
<blockquote>
<p>&quot;main.cpp&quot;: main.cpp error: no matching function for call to `for_each(__gnu_cxx::__normal_iterator&lt;transferitem_t*, std::vector&lt;transferitem_t, std::allocator&lt;transferitem_t&gt; &gt; &gt;, __gnu_cxx::__normal_iterator&lt;transferitem_t*, std::vector&lt;transferitem_t, std::allocator&lt;transferitem_t&gt; &gt; &gt;, doSomething()::ConditionalAdd)' at line 35</p>
</blockquote>
<p>BCC 5.6.5 schrieb:</p>
<blockquote>
<p>&quot;main.cpp&quot;: E2285 Could not find a match for 'for_each&lt;_InputIter,_Function&gt;(transferitem_t *,transferitem_t *,ConditionalAdd)' in function doSomething() at line 35</p>
</blockquote>
<p>BCC 5.82 schrieb:</p>
<blockquote>
<p>&quot;main.cpp&quot;: E2285 Could not find a match for 'for_each&lt;_InIt,_Fn1&gt;(_Vector_iterator&lt;transferitem_t,allocator&lt;transferitem_t&gt; &gt;,_Vector_iterator&lt;transferitem_t,allocator&lt;transferitem_t&gt; &gt;,ConditionalAdd)' in function doSomething() at line 35</p>
</blockquote>
<p>Wenn ich in der entsprechenden Zeile die Template-Argumente explizit angebe, akzeptiert zumindest der BCC den Code, MinGW bringt den gleichen Fehler.</p>
<pre><code class="language-cpp">for_each &lt;std::vector &lt;transferitem_t&gt;::iterator, const ConditionalAdd&amp;&gt; (ti.begin (), ti.end (), ConditionalAdd (1, 2));
</code></pre>
<p>Dabei müßte das doch auch ohne funktionieren, oder?<br />
Bitte sagt mir, daß ich nur irgendeine Kleinigkeit falsch mache <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/176056/funktionsobjekt-und-for_each</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 08:00:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/176056.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 16 Mar 2007 21:28:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionsobjekt und for_each on Fri, 16 Mar 2007 21:28:18 GMT]]></title><description><![CDATA[<p>Folgender Code wird von MinGW und BCC nicht kompiliert:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;functional&gt;
#include &lt;vector&gt;

using namespace std;

struct transferitem_t
{
    unsigned dst;

    transferitem_t (void) : dst (0) {}
};

std::vector &lt;transferitem_t&gt; ti (5);

void doSomething (void)
{
    class ConditionalAdd : public unary_function &lt;void, transferitem_t&amp;&gt;
    {
    private:
        unsigned i, sz;
    public:
        ConditionalAdd (void)
        {}
        ConditionalAdd (unsigned i_, unsigned sz_)
         : i (i_), sz (sz_) {}
        ConditionalAdd (const ConditionalAdd&amp; obj)
         : i (obj.i), sz (obj.sz) {}
        void operator () (transferitem_t&amp; ti) const
        {
            if (ti.dst &gt; i)
                ti.dst += sz;
        }
    };

    for_each (ti.begin (), ti.end (), ConditionalAdd (1, 2));
}
</code></pre>
<p>Die Fehlermeldungen lauten:</p>
<p>MinGW 3.4.2 schrieb:</p>
<blockquote>
<p>&quot;main.cpp&quot;: main.cpp error: no matching function for call to `for_each(__gnu_cxx::__normal_iterator&lt;transferitem_t*, std::vector&lt;transferitem_t, std::allocator&lt;transferitem_t&gt; &gt; &gt;, __gnu_cxx::__normal_iterator&lt;transferitem_t*, std::vector&lt;transferitem_t, std::allocator&lt;transferitem_t&gt; &gt; &gt;, doSomething()::ConditionalAdd)' at line 35</p>
</blockquote>
<p>BCC 5.6.5 schrieb:</p>
<blockquote>
<p>&quot;main.cpp&quot;: E2285 Could not find a match for 'for_each&lt;_InputIter,_Function&gt;(transferitem_t *,transferitem_t *,ConditionalAdd)' in function doSomething() at line 35</p>
</blockquote>
<p>BCC 5.82 schrieb:</p>
<blockquote>
<p>&quot;main.cpp&quot;: E2285 Could not find a match for 'for_each&lt;_InIt,_Fn1&gt;(_Vector_iterator&lt;transferitem_t,allocator&lt;transferitem_t&gt; &gt;,_Vector_iterator&lt;transferitem_t,allocator&lt;transferitem_t&gt; &gt;,ConditionalAdd)' in function doSomething() at line 35</p>
</blockquote>
<p>Wenn ich in der entsprechenden Zeile die Template-Argumente explizit angebe, akzeptiert zumindest der BCC den Code, MinGW bringt den gleichen Fehler.</p>
<pre><code class="language-cpp">for_each &lt;std::vector &lt;transferitem_t&gt;::iterator, const ConditionalAdd&amp;&gt; (ti.begin (), ti.end (), ConditionalAdd (1, 2));
</code></pre>
<p>Dabei müßte das doch auch ohne funktionieren, oder?<br />
Bitte sagt mir, daß ich nur irgendeine Kleinigkeit falsch mache <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1246983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1246983</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Fri, 16 Mar 2007 21:28:18 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsobjekt und for_each on Fri, 16 Mar 2007 22:45:28 GMT]]></title><description><![CDATA[<p>Ich hätte auch gedacht, dass es gehen müsste. Es sieht so aus, als wäre es ein generelles Problem mit Function-Templates und Parametern in Form von Structs bzw. Klassen, die in Funktionen geschachtelt sind, denn folgender kleine Test löst den gleichen Kompilierfehler aus:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
void fubar(const T &amp;nkrumah)
{
}

void fu()
{
    struct bar{};
    fubar(bar());
}
</code></pre>
<p>Ich wüsste gerne, was der Standard dazu sagt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247004</guid><dc:creator><![CDATA[wxLearner]]></dc:creator><pubDate>Fri, 16 Mar 2007 22:45:28 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsobjekt und for_each on Fri, 16 Mar 2007 23:13:22 GMT]]></title><description><![CDATA[<p>Der Standard sagt AFAIK dass das nicht geht.<br />
Typen die als Template Parameter hergenommen werden müssen &quot;external linkage&quot; haben.<br />
Lokale Klassen haben das nicht -&gt; geht nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247017</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 16 Mar 2007 23:13:22 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsobjekt und for_each on Fri, 16 Mar 2007 23:41:01 GMT]]></title><description><![CDATA[<p>OK, dann muß die Klassendefinition eben da raus. Danke für die Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247026</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Fri, 16 Mar 2007 23:41:01 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsobjekt und for_each on Sat, 17 Mar 2007 02:20:03 GMT]]></title><description><![CDATA[<p>Du kannst übrigens nen &quot;nameless namespace&quot; nehmen damit die Klasse nicht mit anderen gleichnamigen (in anderen translation units) kollidiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1247067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1247067</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 17 Mar 2007 02:20:03 GMT</pubDate></item></channel></rss>