<?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[binder: STL falsch verstanden oder Implementierung broken?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich arbeite erst seit kurzem verstärkt mit der STL und erweiterter Nutzung von Templates im Allgemeinen. Jetzt habe ich eine Methode, die einen String empfängt und diesen an mehrere Objekte in einer Liste weiterverteilen möchte (zur Verdeutlichung: Ein &quot;job&quot; hat mehrere &quot;units&quot;. Ein &quot;job&quot; hat ein Basisverzeichnis, jede &quot;unit&quot; hat dort ein Unterverzeichnis):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;functional&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;

class unit {
private:
  int index;
  std::string path;
public:
  void set_path(const std::string&amp; path_);
};

void unit::set_path(const std::string&amp; path_)
{
  std::stringstream str;
  str &lt;&lt; path_ &lt;&lt; &quot;/&quot; &lt;&lt; index;
  path = str.str();
}

class job {
private:
  std::string path;
public:
  std::vector&lt;unit*&gt; units;
  void set_path(const std::string&amp; path);
};

void job::set_path(const std::string&amp; path_)
{
  path = path_;
  std::for_each(units.begin(), units.end(), std::bind2nd( std::mem_fun( &amp;unit::set_path ), path_));
}

int main(void)
{
  job myJob;
  myJob.units.push_back(new unit());
  myJob.set_path(&quot;/tmp/irgendwo&quot;);
}
</code></pre>
<p>In der for_each Zeile bekomme ich den Fehler</p>
<blockquote>
<p>/usr/include/c++/3.3/bits/stl_function.h:393: error: forming reference to reference type `const std::string&amp;'</p>
</blockquote>
<p>Wenn ich den Parametertyp von set_path von const std::string&amp; auf std::string ändere funktionierts. Sehe ich den Wald vor lauter Bäumen nicht, ist meine STL broken oder beherrschen die STL-Binder wirklich nur Wertübergabe?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/142778/binder-stl-falsch-verstanden-oder-implementierung-broken</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 22:06:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/142778.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 02 Apr 2006 19:08:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to binder: STL falsch verstanden oder Implementierung broken? on Sun, 02 Apr 2006 19:08:14 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich arbeite erst seit kurzem verstärkt mit der STL und erweiterter Nutzung von Templates im Allgemeinen. Jetzt habe ich eine Methode, die einen String empfängt und diesen an mehrere Objekte in einer Liste weiterverteilen möchte (zur Verdeutlichung: Ein &quot;job&quot; hat mehrere &quot;units&quot;. Ein &quot;job&quot; hat ein Basisverzeichnis, jede &quot;unit&quot; hat dort ein Unterverzeichnis):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;functional&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;

class unit {
private:
  int index;
  std::string path;
public:
  void set_path(const std::string&amp; path_);
};

void unit::set_path(const std::string&amp; path_)
{
  std::stringstream str;
  str &lt;&lt; path_ &lt;&lt; &quot;/&quot; &lt;&lt; index;
  path = str.str();
}

class job {
private:
  std::string path;
public:
  std::vector&lt;unit*&gt; units;
  void set_path(const std::string&amp; path);
};

void job::set_path(const std::string&amp; path_)
{
  path = path_;
  std::for_each(units.begin(), units.end(), std::bind2nd( std::mem_fun( &amp;unit::set_path ), path_));
}

int main(void)
{
  job myJob;
  myJob.units.push_back(new unit());
  myJob.set_path(&quot;/tmp/irgendwo&quot;);
}
</code></pre>
<p>In der for_each Zeile bekomme ich den Fehler</p>
<blockquote>
<p>/usr/include/c++/3.3/bits/stl_function.h:393: error: forming reference to reference type `const std::string&amp;'</p>
</blockquote>
<p>Wenn ich den Parametertyp von set_path von const std::string&amp; auf std::string ändere funktionierts. Sehe ich den Wald vor lauter Bäumen nicht, ist meine STL broken oder beherrschen die STL-Binder wirklich nur Wertübergabe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1029379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1029379</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Sun, 02 Apr 2006 19:08:14 GMT</pubDate></item><item><title><![CDATA[Reply to binder: STL falsch verstanden oder Implementierung broken? on Sun, 02 Apr 2006 19:25:33 GMT]]></title><description><![CDATA[<p>Hmm, ist das nicht die Baustelle von boost:: (c)ref? Wenn ja, dann probiers damit, ansonsten übergib halt einen Zeiger.<br />
Ist im übrigen kein schönes Design. (Hoffentlich nur ein Beispiel ...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1029382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1029382</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sun, 02 Apr 2006 19:25:33 GMT</pubDate></item><item><title><![CDATA[Reply to binder: STL falsch verstanden oder Implementierung broken? on Sun, 02 Apr 2006 19:23:06 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<blockquote>
<p>/usr/include/c++/3.3/bits/stl_function.h:393: error: forming reference to reference type `const std::string&amp;'</p>
</blockquote>
<p>Wenn ich den Parametertyp von set_path von const std::string&amp; auf std::string ändere funktionierts.</p>
</blockquote>
<p>Das Problem &quot;reference to reference&quot; ist bekannt. Ich find' jetzt gerade keinen Link, wo es erklärt wird. Die Änderung zu 'per value' statt 'per reference' ist der einzige mir bekannte Workaround.<br />
Das ist einer der Gründe warum bei den Bindern lieber <a href="http://www.boost.org/libs/bind/bind.html" rel="nofollow">boost::bind</a> statt std::bind* nehmen soll.<br />
In diesem Fall:</p>
<pre><code class="language-cpp">std::for_each(units.begin(), units.end(), boost::bind( &amp;unit::set_path, _1, path_ ) );
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1029384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1029384</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sun, 02 Apr 2006 19:23:06 GMT</pubDate></item><item><title><![CDATA[Reply to binder: STL falsch verstanden oder Implementierung broken? on Sun, 02 Apr 2006 19:27:05 GMT]]></title><description><![CDATA[<p>Vielen Dank, hab ich mir schon fast gedacht...</p>
<p>Das Beispiel ist das berühmte Minimalbeispiel um das Problem zu demonstrieren, und kein Produktivcode, genau wie Ihr es immer predigt (und auch ich es natürlich am liebsten habe)</p>
<p>Die Benutzung von boost kommt erstmal nicht in Betracht (ich kenne die Zielgruppe und deren Abneigung gegen neue Abhängigkeiten sehr genau <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="😉"
    /> ), vielleicht kopier ich mir aber doch mal ein paar Header-Only Sachen (glaube bind gehört dazu) zusammen und liefer sie direkt mit meinem Code aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1029386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1029386</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Sun, 02 Apr 2006 19:27:05 GMT</pubDate></item><item><title><![CDATA[Reply to binder: STL falsch verstanden oder Implementierung broken? on Sun, 02 Apr 2006 19:56:15 GMT]]></title><description><![CDATA[<p>boost::binder gehört zum TR1, also ist vom ISO-C++ Kommittee abgesegnet. Ist also keine externe Abhängigkeit. Du kannst auch den TR1-Wrapper von Boost benutzen, dann ist auch alles im richtigen Namespace std::tr1.</p>
<p>Hach, ich glaub ich muß wirklich mal einen TR1-Artikel für das C++ Magazin schreiben. Kann ja nicht sein, das die C++ Scene immer noch keinen TR1 kennt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1029406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1029406</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sun, 02 Apr 2006 19:56:15 GMT</pubDate></item><item><title><![CDATA[Reply to binder: STL falsch verstanden oder Implementierung broken? on Sun, 02 Apr 2006 20:51:38 GMT]]></title><description><![CDATA[<p>Nen Artikel dazu was wir demnächst im Standard erwarten dürfen wäre in der Tat sehr nett <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>
<p>EDIT:<br />
Mit boost::bind klappt mein Code übrigens sehr gut, konnte mir sogar noch ein paar Hilfsfunktoren sparen, danke <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/1029426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1029426</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Sun, 02 Apr 2006 20:51:38 GMT</pubDate></item></channel></rss>