<?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[Ergebnis von boost::bind explizit nach boost::function casten - Wieso ist das nötig?]]></title><description><![CDATA[<p>Und schon wieder ein Problem:</p>
<pre><code class="language-cpp">class Server {
public:
    register(boost::function&lt;void(const std::string&amp;)&gt; f);
};

class Foo {
public:
    Foo(Server&amp; serv) { serv.register(boost::bind(&amp;Foo::bar, this, _1));}
    void bar(const std::string&amp;) {std::cout &lt;&lt; bar &lt;&lt; std::endl;}
};
</code></pre>
<p>Kompiliert nicht mit der Mitteilung das</p>
<pre><code class="language-cpp">boost::_bi::bind_t&lt;void, boost::_mfi::mf1&lt;void, Foo, const std::string&amp;&gt;, boost::_bi::list2&lt;boost::_bi::value&lt;Foo*&gt;, boost::arg&lt;1&gt; &gt; &gt;
</code></pre>
<p>nicht in</p>
<pre><code class="language-cpp">boost::function&lt;void(const std::string&amp;)&gt;
</code></pre>
<p>konvertiert werden kann.</p>
<p>Wenn ich es explizit nach boost::function&lt;void(const std::string&amp;)&gt; caste, gehts durch den Kompiler und funktioniert hinterher auch.</p>
<p>Warum?<br />
Fällt aus boost::bind keine boost::function raus?</p>
<p>Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277102/ergebnis-von-boost-bind-explizit-nach-boost-function-casten-wieso-ist-das-nötig</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 00:40:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277102.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 Nov 2010 23:07:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ergebnis von boost::bind explizit nach boost::function casten - Wieso ist das nötig? on Fri, 12 Nov 2010 23:08:47 GMT]]></title><description><![CDATA[<p>Und schon wieder ein Problem:</p>
<pre><code class="language-cpp">class Server {
public:
    register(boost::function&lt;void(const std::string&amp;)&gt; f);
};

class Foo {
public:
    Foo(Server&amp; serv) { serv.register(boost::bind(&amp;Foo::bar, this, _1));}
    void bar(const std::string&amp;) {std::cout &lt;&lt; bar &lt;&lt; std::endl;}
};
</code></pre>
<p>Kompiliert nicht mit der Mitteilung das</p>
<pre><code class="language-cpp">boost::_bi::bind_t&lt;void, boost::_mfi::mf1&lt;void, Foo, const std::string&amp;&gt;, boost::_bi::list2&lt;boost::_bi::value&lt;Foo*&gt;, boost::arg&lt;1&gt; &gt; &gt;
</code></pre>
<p>nicht in</p>
<pre><code class="language-cpp">boost::function&lt;void(const std::string&amp;)&gt;
</code></pre>
<p>konvertiert werden kann.</p>
<p>Wenn ich es explizit nach boost::function&lt;void(const std::string&amp;)&gt; caste, gehts durch den Kompiler und funktioniert hinterher auch.</p>
<p>Warum?<br />
Fällt aus boost::bind keine boost::function raus?</p>
<p>Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979739</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Fri, 12 Nov 2010 23:08:47 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnis von boost::bind explizit nach boost::function casten - Wieso ist das nötig? on Sat, 13 Nov 2010 05:01:05 GMT]]></title><description><![CDATA[<p>Du nennst deine Funktion nicht wirklich register? Sonst geht das eigentlich schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979761</guid><dc:creator><![CDATA[autsch]]></dc:creator><pubDate>Sat, 13 Nov 2010 05:01:05 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnis von boost::bind explizit nach boost::function casten - Wieso ist das nötig? on Sat, 13 Nov 2010 09:46:16 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Und schon wieder ein Problem:</p>
<pre><code class="language-cpp">class Server {
public:
    register(boost::function&lt;void(const std::string&amp;)&gt; f);
};

class Foo {
public:
    Foo(Server&amp; serv) { serv.register(boost::bind(&amp;Foo::bar, this, _1));}
    void bar(const std::string&amp;) {std::cout &lt;&lt; bar &lt;&lt; std::endl;}
};
</code></pre>
<p>Kompiliert nicht mit der Mitteilung das</p>
<pre><code class="language-cpp">boost::_bi::bind_t&lt;void, boost::_mfi::mf1&lt;void, Foo, const std::string&amp;&gt;, boost::_bi::list2&lt;boost::_bi::value&lt;Foo*&gt;, boost::arg&lt;1&gt; &gt; &gt;
</code></pre>
</blockquote>
<p>Was du da gepsotet hast compiliert sicher nicht mit der Fehlermeldung (dafür sind zu viele Fehler drin). Wenn du Hilfe willst, solltest du den tatsächlichen Code oder ein minimales Beispiel, das den Fehler reproduziert, posten. Ohne die anderen Fehler geht's jedenfalls.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979789</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 13 Nov 2010 09:46:16 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnis von boost::bind explizit nach boost::function casten - Wieso ist das nötig? on Sat, 13 Nov 2010 12:18:52 GMT]]></title><description><![CDATA[<p>Natürlich ist das stark zusammengekürzt. Und die Funktion heißt natürlich auch nicht &quot;register&quot;-was ja ein Schlüsselwort wäre.</p>
<p>Ich bemühe mich halt immer, möglichst nur die &quot;verdächtigen&quot; Codestellen zu posten, da ich weiß, dass keiner Lust hat, 500 Zeilen-Postings zu lesen wo einer einfach mal das ganze Programm postet mit der Bitte, doch den Fehler rauszumachen.</p>
<p>Hier habe ich aber wohl zuviel gekürzt.</p>
<p>Das sollte vollständiger, aber wahrscheinlich nicht einfacher zu verstehen sein:</p>
<pre><code class="language-cpp">class Receiver
{
public:
    template &lt;typename T&gt;
    void requestData(can_Id_t can_id, boost::function&lt;void (const T&amp;)&gt; f, T* t);
...
};

class FSAccessSCSImpl : public FSAccess, public Receiver
{
    Q_OBJECT
public:
    FSAccessSCSImpl() {
        requestData(UTC_TIME::Id(),
                    boost::function&lt;void(const char4&amp;)&gt;(boost::bind(&amp;FSAccessSCSImpl::resetTimer, this, _1)), 
                    &amp;m_time);
}

protected:

    void resetTimer(const char4&amp;);

private:
    char4 m_time;
};
</code></pre>
<p>Das funktioniert so.<br />
Aber man beachte den Cast</p>
<pre><code class="language-cpp">boost::function&lt;void(const char4&amp;)&gt;(boost::bind(&amp;FSAccessSCSImpl::resetTimer, this, _1))
</code></pre>
<p>Ohne den cast tritt oben genannter Fehler auf.</p>
<p>Kann es sein, dass boost::_bi::bint_t&lt;... nach boost::function&lt;... konvertierbar ist, aber die Konversion nicht benutzt wird, um das richtige Funktionstemplate auszuwählen?</p>
<p>Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979840</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sat, 13 Nov 2010 12:18:52 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnis von boost::bind explizit nach boost::function casten - Wieso ist das nötig? on Sat, 13 Nov 2010 16:05:27 GMT]]></title><description><![CDATA[<p>Muss denn der Parameter unbedingt gleich ein boost::function-Objekt sein? Gib doch die Funktion direkt per template-Parameter mit (geht auch mit boost::bind):</p>
<pre><code class="language-cpp">#include &lt;boost/bind.hpp&gt;
#include &lt;boost/function.hpp&gt;
#include &lt;string&gt;
#include &lt;iostream&gt;

struct Fun {
  template &lt;typename Fun, typename T&gt;
  void run(Fun fun, T const&amp; t) {
    fun(t);
  }
};

struct Test {
  void run() {
    Fun f;
    f.run(boost::bind(&amp;Test::test, this, _1), std::string(&quot;Hallo&quot;));
  }
  void test(const std::string&amp; s) {
    std::cout &lt;&lt; s &lt;&lt; std::endl;
  }
};

int main() {
  Test t;
  t.run();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1979973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979973</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sat, 13 Nov 2010 16:05:27 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnis von boost::bind explizit nach boost::function casten - Wieso ist das nötig? on Sat, 13 Nov 2010 16:53:38 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Fällt aus boost::bind keine boost::function raus?</p>
</blockquote>
<p>Nein. Aber es sollte bei &quot;kompatiblen Signaturen&quot; in ein entsprechendes boost::function&lt;&gt;-Objekt konvertierbar sein.</p>
<p>Es sollte auch möglich sein, ein <em>reduziertes</em>, <em>vollständiges</em> Beispiel zu präsentieren. Ja, dazu musst Du 'n bissel Hand anlegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979990</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 13 Nov 2010 16:53:38 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnis von boost::bind explizit nach boost::function casten - Wieso ist das nötig? on Sat, 13 Nov 2010 18:48:34 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>PhilippM schrieb:</p>
<blockquote>
<p>Fällt aus boost::bind keine boost::function raus?</p>
</blockquote>
<p>Nein. Aber es sollte bei &quot;kompatiblen Signaturen&quot; in ein entsprechendes boost::function&lt;&gt;-Objekt konvertierbar sein.</p>
</blockquote>
<p>Ahh, das erklärt einiges. Es bestätigt auch meine Vermutung: Wenn ich die Funktion testweise ohne Template hinschreibe, so dass sie nur boost::function&lt;void(const char4&amp;)&gt; erwartet, klappts plötzlich auch ohne cast. Offenbar versucht der Kompiler nicht das Argument implizit in etwas zu konvertieren, was aufs Teplate passt.</p>
<p>Ist auch irgendwie logisch, denn das template muss ja erstmal instantiiert werden. Denn dann müsste der kompiler ja erstmal alle implizieten konvertierungen eines typs erzeugen und sich dann aus den Fingern saugen, zu welcher er das template instantiieren soll.</p>
<p>Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1980041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1980041</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sat, 13 Nov 2010 18:48:34 GMT</pubDate></item><item><title><![CDATA[Reply to Ergebnis von boost::bind explizit nach boost::function casten - Wieso ist das nötig? on Sat, 13 Nov 2010 22:59:30 GMT]]></title><description><![CDATA[<p>PhilippM schrieb:</p>
<blockquote>
<p>Ist auch irgendwie logisch, denn das template muss ja erstmal instantiiert werden. Denn dann müsste der kompiler ja erstmal alle implizieten konvertierungen eines typs erzeugen und sich dann aus den Fingern saugen, zu welcher er das template instantiieren soll.</p>
</blockquote>
<p>Ich glaube du meinst schon das richtige, aber ich würde es anders ausdrücken: die Type-Deduction haut nicht hin, weil dabei - vermutlich - keine userdefinierten Konvertierungen berücksichtigt werden (müsste das nachschlagen, klingt aber logisch).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1980147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1980147</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 13 Nov 2010 22:59:30 GMT</pubDate></item></channel></rss>