<?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[Problem: boost::function mit std::set]]></title><description><![CDATA[<p>Hi,</p>
<p>ich weiß nicht warum der folgende Code nicht funktioniert.<br />
Falls ich comp verwende funktioniert es, falls ich die boost::bind im zusammenhang mit der Klassenfunktion verwende nicht, ich weiß aber nicht wieso denn die Signatur müsste eigentlich stimmen.</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &lt;boost/function.hpp&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;string&gt;
#include &lt;set&gt;

using namespace boost;
using namespace std;

class test
{
public:
	test() {};
	string str;
	bool compare(test b) { return str&lt;b.str; }
};

struct comp
{
	bool operator() (const test a, const test b) { return a.str&gt;b.str;} 
};

int _tmain(int argc, _TCHAR* argv[])
{

	boost::function&lt;bool (test , test)&gt; compfunc;
	compfunc=&amp;test::compare;

	set&lt; test, compfunc &gt; B;
	//set&lt;test,comp&gt; B;

	test ta;
	ta.str=&quot;blubb&quot;;

	test tb;
	tb.str=&quot;bla&quot;;

	cout &lt;&lt; &quot;---&quot; &lt;&lt; compfunc(ta,tb) &lt;&lt;&quot;\n&quot;;
	cout &lt;&lt; &quot;---&quot; &lt;&lt; compfunc(tb,ta) &lt;&lt;&quot;\n&quot;;

	cin.get();
	return 0;
}
</code></pre>
<p>Das ganze ergibt folgende Fehlermeldung:</p>
<pre><code>testprj2.cpp(42) : error C2923: 'std::set': 'compfunc' ist als Vorlagenargument '#2' ungültig, Typ erwartet
        testprj2.cpp(39): Siehe Deklaration von 'compfunc'
</code></pre>
<p>Kennt hier jemand die Lösung dieses Problems.<br />
(operator überladen oder so iss klar, aber wie geht es so?)</p>
<p>MFG<br />
mamue110</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/234110/problem-boost-function-mit-std-set</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 13:57:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/234110.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 13 Feb 2009 08:20:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem: boost::function mit std::set on Fri, 13 Feb 2009 08:22:42 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich weiß nicht warum der folgende Code nicht funktioniert.<br />
Falls ich comp verwende funktioniert es, falls ich die boost::bind im zusammenhang mit der Klassenfunktion verwende nicht, ich weiß aber nicht wieso denn die Signatur müsste eigentlich stimmen.</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &lt;boost/function.hpp&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;string&gt;
#include &lt;set&gt;

using namespace boost;
using namespace std;

class test
{
public:
	test() {};
	string str;
	bool compare(test b) { return str&lt;b.str; }
};

struct comp
{
	bool operator() (const test a, const test b) { return a.str&gt;b.str;} 
};

int _tmain(int argc, _TCHAR* argv[])
{

	boost::function&lt;bool (test , test)&gt; compfunc;
	compfunc=&amp;test::compare;

	set&lt; test, compfunc &gt; B;
	//set&lt;test,comp&gt; B;

	test ta;
	ta.str=&quot;blubb&quot;;

	test tb;
	tb.str=&quot;bla&quot;;

	cout &lt;&lt; &quot;---&quot; &lt;&lt; compfunc(ta,tb) &lt;&lt;&quot;\n&quot;;
	cout &lt;&lt; &quot;---&quot; &lt;&lt; compfunc(tb,ta) &lt;&lt;&quot;\n&quot;;

	cin.get();
	return 0;
}
</code></pre>
<p>Das ganze ergibt folgende Fehlermeldung:</p>
<pre><code>testprj2.cpp(42) : error C2923: 'std::set': 'compfunc' ist als Vorlagenargument '#2' ungültig, Typ erwartet
        testprj2.cpp(39): Siehe Deklaration von 'compfunc'
</code></pre>
<p>Kennt hier jemand die Lösung dieses Problems.<br />
(operator überladen oder so iss klar, aber wie geht es so?)</p>
<p>MFG<br />
mamue110</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1662963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1662963</guid><dc:creator><![CDATA[mamue110]]></dc:creator><pubDate>Fri, 13 Feb 2009 08:22:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: boost::function mit std::set on Fri, 13 Feb 2009 08:34:25 GMT]]></title><description><![CDATA[<p>[quote=&quot;mamue110&quot;]<br />
boost::function&lt;bool (test , test)&gt; compfunc;<br />
compfunc=&amp;test::compare;<br />
[/cpp]</p>
<p>Der Template-Parametertyp stimmt schonmal nicht mit der Signatur von test::compare überein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1662970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1662970</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 13 Feb 2009 08:34:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: boost::function mit std::set on Fri, 13 Feb 2009 08:56:42 GMT]]></title><description><![CDATA[<p>das passt schon.<br />
bei boost::function&lt;bool (test , test)&gt; wird das erste Argunemt als das Objekt und das zweite als Funktionsargument verwendet. Das habe ich mit<br />
compfunc(ta,tb), was ta.compare(tb) entspricht, getestet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1662980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1662980</guid><dc:creator><![CDATA[mamue110]]></dc:creator><pubDate>Fri, 13 Feb 2009 08:56:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: boost::function mit std::set on Fri, 13 Feb 2009 09:00:24 GMT]]></title><description><![CDATA[<p>boost::function&lt;bool (test , test)&gt; compfunc;</p>
<p>'compfunc' ist als Vorlagenargument '#2' ungültig, Typ erwartet</p>
<p>ist compfunc ein Typ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1662985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1662985</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 13 Feb 2009 09:00:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: boost::function mit std::set on Fri, 13 Feb 2009 09:04:51 GMT]]></title><description><![CDATA[<p>Hmm, schon merkwürdig, dass implizit zu Test* konvertiert wird, aber gut... mal was anderes: Du parametrisiert den Compare-Typ deiner std::set mit einer Variablen... sprich richtig wäre:</p>
<pre><code class="language-cpp">typedef  boost::function&lt;bool (test , test)&gt; compfunc;
 set&lt; test, compfunc &gt; B;
</code></pre>
<p>Edit: Anwendung</p>
<pre><code class="language-cpp">typedef  boost::function&lt;bool (test , test)&gt; compfunc;
 compfunc f =&amp;test::compare;

 set&lt; test, compfunc &gt; B(f);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1662986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1662986</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 13 Feb 2009 09:04:51 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: boost::function mit std::set on Fri, 13 Feb 2009 09:33:20 GMT]]></title><description><![CDATA[<p>Ich versteh nich genau was du damit meinst, jedenfalls compiliert das nicht.<br />
Mein Problem:<br />
std::set erwartet als ersten Template-Parameter den Datentypen und als optionalen zweiten Templateparameter eine vergleichsfunktion. Diese muss der Signatur bool (datentyp, datentyp), in meinem Fall also bool (test,test) entsprechen.<br />
Erstelle ich mein Funktionsobjekt selbst (siehe struct comp) geht das ganze ohne Probleme. Wenn ich jedoch das Funktionsobjekt über boost Function erstelle geht es nicht. Wenn man die beiden verwendet sehen sie genau gleich aus:</p>
<pre><code>comp(ta,tb)
compfunc(ta,tb)
</code></pre>
<p>und beide geben einen boolean zurück.</p>
<p>Was ich nicht verstehe ist dass set&lt;test,comp&gt; compiliert, set&lt; test, compfunc &gt; jedoch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1663009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1663009</guid><dc:creator><![CDATA[mamue110]]></dc:creator><pubDate>Fri, 13 Feb 2009 09:33:20 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: boost::function mit std::set on Fri, 13 Feb 2009 09:32:06 GMT]]></title><description><![CDATA[<p>mamue110 schrieb:</p>
<blockquote>
<p>Was ich nicht verstehe ist dass set&lt;test,comp&gt; compiliert, set&lt; test, compfunc &gt; jedoch nicht.</p>
</blockquote>
<p>compfunc ist eine VARIABLE und kein TYP!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1663010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1663010</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 13 Feb 2009 09:32:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: boost::function mit std::set on Fri, 13 Feb 2009 09:44:07 GMT]]></title><description><![CDATA[<p>Ok,</p>
<p>jetzt hats klick gemacht. Ich weiß jetzt aber immernoch nicht wie ich das ganze jetzt verwenden soll</p>
<pre><code class="language-cpp">typedef boost::function&lt;bool (test , test)&gt; sig;
sig compfunc;
compfunc=&amp;test::compare;
set&lt; test, sig &gt; B;
</code></pre>
<p>...compiliert zwar, kann aber nicht wirklich verwendet werden (bringt bei zweitem Insert, also wenn er zum ersten mal sortieren will, einen Laufzeitfehler).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1663017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1663017</guid><dc:creator><![CDATA[mamue110]]></dc:creator><pubDate>Fri, 13 Feb 2009 09:44:07 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: boost::function mit std::set on Fri, 13 Feb 2009 09:55:37 GMT]]></title><description><![CDATA[<p>Schau dir mal die std::set Konstruktoren an <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/1663024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1663024</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 13 Feb 2009 09:55:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: boost::function mit std::set on Fri, 13 Feb 2009 11:29:23 GMT]]></title><description><![CDATA[<p>so, nach etwas code-lesen habe ich es zwar nicht über den Konstruktor hinbekommen aber es läuft....</p>
<pre><code class="language-cpp">typedef boost::function&lt;bool (test , test)&gt; sig;

sig compfunc;
compfunc=&amp;test::compare;

set&lt; test, sig &gt; B;
B.comp=compfunc;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1663067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1663067</guid><dc:creator><![CDATA[mamue110]]></dc:creator><pubDate>Fri, 13 Feb 2009 11:29:23 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: boost::function mit std::set on Fri, 13 Feb 2009 11:56:04 GMT]]></title><description><![CDATA[<p>mamue110  schrieb:</p>
<blockquote>
<pre><code class="language-cpp">set&lt; test, sig &gt; B;
B.comp=compfunc;
</code></pre>
</blockquote>
<p>Das kannst du einfacher haben:</p>
<pre><code class="language-cpp">set&lt; test, sig &gt; B(compfunc);
</code></pre>
<p>Das meint ich mit, schau dir mal die Konstruktoren an.</p>
<p>Was mich wundert, wie kannst du nachträglich noch die Compare-Funktion zuweisen???</p>
<p>EDIT: Ah, alles klar. Die Visual C++ Implementation der STL erlaubt einen öffentlichen Zugriff... Das verletzt doch dann die Integrität <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <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/1663084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1663084</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 13 Feb 2009 11:56:04 GMT</pubDate></item></channel></rss>