<?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[[STL] Funktionszeiger von Memberfunktion]]></title><description><![CDATA[<p>Hallo,</p>
<p>für ein std::find_if() Konstrukt brauche ich einen Funktionszeiger auf eine Memberfunktion. Mein Ansatz bisher war std::mem_fun_ref() was jedoch leider nicht für Memberfunktionen mit folgender Signatur zu funktionieren scheint:</p>
<pre><code class="language-cpp">bool Example::compare(const std::string&amp; rhs) const;
</code></pre>
<p>Das Problem ist, der Kompiler hat ein Problem mit dem per Referenz übergebenen Parameter, was für mich auch nachvollziehbar ist, wenn man die Implementierung des Templates ansieht (was ja dem Ausdruck entsprechen würde: const std::string &amp;&amp;).</p>
<p>Nun die Frage, wie kann ich einen Zeiger auf die Memberfunktion bekommen? Geht das mit der Standardbibliothek? Wenn nein, wird es mit dem neuen Standard gehen werden?</p>
<p>Vielen Dank<br />
i_like_it</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/197645/stl-funktionszeiger-von-memberfunktion</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 09:29:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/197645.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Nov 2007 08:04:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [STL] Funktionszeiger von Memberfunktion on Tue, 13 Nov 2007 08:04:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>für ein std::find_if() Konstrukt brauche ich einen Funktionszeiger auf eine Memberfunktion. Mein Ansatz bisher war std::mem_fun_ref() was jedoch leider nicht für Memberfunktionen mit folgender Signatur zu funktionieren scheint:</p>
<pre><code class="language-cpp">bool Example::compare(const std::string&amp; rhs) const;
</code></pre>
<p>Das Problem ist, der Kompiler hat ein Problem mit dem per Referenz übergebenen Parameter, was für mich auch nachvollziehbar ist, wenn man die Implementierung des Templates ansieht (was ja dem Ausdruck entsprechen würde: const std::string &amp;&amp;).</p>
<p>Nun die Frage, wie kann ich einen Zeiger auf die Memberfunktion bekommen? Geht das mit der Standardbibliothek? Wenn nein, wird es mit dem neuen Standard gehen werden?</p>
<p>Vielen Dank<br />
i_like_it</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402250</guid><dc:creator><![CDATA[i_like_it]]></dc:creator><pubDate>Tue, 13 Nov 2007 08:04:30 GMT</pubDate></item><item><title><![CDATA[Reply to [STL] Funktionszeiger von Memberfunktion on Tue, 13 Nov 2007 08:11:08 GMT]]></title><description><![CDATA[<p>Für std::find_if() brauchst du einen unären Funktor - diese Methode erwartet allerdings zwei &quot;Parameter&quot; (this und rhs). Das heißt, du müsstest mem_fun_ref() noch mit bind2nd() kombinieren, um einen Parameterwert vorzugeben:</p>
<pre><code class="language-cpp">string comp = &quot;Hallo Welt&quot;;
MyCont::iterator pos = find_if(container.begin(),container.end(),bind2nd(mem_fun_ref(&amp;Example::compare),comp));
</code></pre>
<p>(mit Boost::bind könnte das etwas kompakter werden)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402257</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 13 Nov 2007 08:11:08 GMT</pubDate></item><item><title><![CDATA[Reply to [STL] Funktionszeiger von Memberfunktion on Tue, 13 Nov 2007 08:27:34 GMT]]></title><description><![CDATA[<p>Ja, genau so hab ich es auch geschrieben, nur habe ich halt das Problem mit der doppelten Referenz <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>
<pre><code class="language-cpp">bool Example::compare(const std::string rhs);
</code></pre>
<p>funktioniert einwandfrei, nur</p>
<pre><code class="language-cpp">bool Example::compare(const std::string &amp;rhs);
</code></pre>
<p>wird die doppelte Referenz mir angekreidet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402265</guid><dc:creator><![CDATA[i_like_it]]></dc:creator><pubDate>Tue, 13 Nov 2007 08:27:34 GMT</pubDate></item><item><title><![CDATA[Reply to [STL] Funktionszeiger von Memberfunktion on Tue, 13 Nov 2007 08:31:23 GMT]]></title><description><![CDATA[<p>Was für eine doppelte Referenz? Zeig mal bitte deinen exakten Code - und die genaue Fehlermeldung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402272</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 13 Nov 2007 08:31:23 GMT</pubDate></item><item><title><![CDATA[Reply to [STL] Funktionszeiger von Memberfunktion on Tue, 13 Nov 2007 09:00:16 GMT]]></title><description><![CDATA[<p>Hier ist ein Beispiel:</p>
<pre><code class="language-cpp">//#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
//#include &lt;algorithm&gt;
#include &lt;functional&gt;

class Example
{
private:
	std::string name;
public:
	explicit Example(const std::string &amp;rhs)
		: name(rhs)
	{}
	bool operator == (const std::string &amp;rhs)
	{
		return name == rhs;
	}

	Example operator()()
	{
		return *this;
	}
};

int main()
{
	std::vector&lt;Example&gt; tmpVec;
	std::generate_n(std::back_inserter(tmpVec), 10, Example(&quot;Hallo&quot;));

	const std::string szCmpExample = &quot;Hallo&quot;;
	std::vector&lt;Example&gt;::iterator myIter = std::find_if(tmpVec.begin(), tmpVec.end(), std::bind2nd(std::mem_fun_ref(&amp;Example::operator ==), szCmpExample));
	if(myIter != tmpVec.end())
	{
		// found ...
	}

	return 0;
}
</code></pre>
<p>mit der Fehlermeldung:</p>
<pre><code>$ g++ memfun.cpp
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h: In instantiation of `std::binder2nd&lt;std::mem_fun1_ref_t&lt;bool, Example, const std::string&amp;&gt; &gt;':memfun.cpp:33:   instantiated from here
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h:436: error: forming reference to reference type `const std::string&amp;'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h: In function `std::binder2nd&lt;_Operation&gt; std::bind2nd(const _Operation&amp;, const _Tp&amp;) [with _Operation = std::mem_fun1_ref_t&lt;bool, Example, const std::string&amp;&gt;, _Tp = std::string]':memfun.cpp:33:   instantiated from here
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h:455: error: no matching function for call to `std::binder2nd&lt;std::mem_fun1_ref_t&lt;bool, Example, const std::string&amp;&gt; &gt;::binder2nd(const std::mem_fun1_ref_t&lt;bool, Example, const std::string&amp;&gt;&amp;, const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;&amp;)'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_function.h:429: note: candidates are: std::binder2nd&lt;std::mem_fun1_ref_t&lt;bool, Example, const std::string&amp;&gt; &gt;::binder2nd(const std::binder2nd&lt;std::mem_fun1_ref_t&lt;bool, Example, const std::string&amp;&gt; &gt;&amp;)
</code></pre>
<p>Wichtiges Element der Fehlermeldung erscheint mir</p>
<pre><code>forming reference to reference type `const std::string&amp;'
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1402293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402293</guid><dc:creator><![CDATA[i_like_it]]></dc:creator><pubDate>Tue, 13 Nov 2007 09:00:16 GMT</pubDate></item><item><title><![CDATA[Reply to [STL] Funktionszeiger von Memberfunktion on Tue, 13 Nov 2007 10:38:38 GMT]]></title><description><![CDATA[<p>Das ist ein bekannter Defekt mit std::bind_Xnd.</p>
<p>Mach doch mal den operator== const. IIRC sollte das helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402374</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Tue, 13 Nov 2007 10:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to [STL] Funktionszeiger von Memberfunktion on Tue, 13 Nov 2007 12:34:46 GMT]]></title><description><![CDATA[<p>7H3 N4C3R schrieb:</p>
<blockquote>
<p>Das ist ein bekannter Defekt mit std::bind_Xnd.</p>
<p>Mach doch mal den operator== const. IIRC sollte das helfen.</p>
</blockquote>
<p>Nein, die Fehlermeldung bleibt die Gleiche... ich gehe von aus, dass das Template mem_fun_ref intern schon eine Referenz nimmt für den Parameter der Methode. Somit würde eine Referenz auf eine Referenz angenommen werden, was wohl das Problem ist, da wenn ich den Operator so ändern, dass keine Referenz erwartet wird, funktioniert es.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402451</guid><dc:creator><![CDATA[i_like_it]]></dc:creator><pubDate>Tue, 13 Nov 2007 12:34:46 GMT</pubDate></item><item><title><![CDATA[Reply to [STL] Funktionszeiger von Memberfunktion on Tue, 13 Nov 2007 14:07:13 GMT]]></title><description><![CDATA[<p>Nein du übersetzt den Satz falsch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /> mach daraus &quot;referenzieren auf Referenztyp&quot; ...</p>
<pre><code class="language-cpp">bool const&amp; operator==(std::string const&amp; rhs) const
{ return name == rhs; }
</code></pre>
<p>sollte eigtl. gehen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402512</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 13 Nov 2007 14:07:13 GMT</pubDate></item><item><title><![CDATA[Reply to [STL] Funktionszeiger von Memberfunktion on Tue, 13 Nov 2007 14:27:45 GMT]]></title><description><![CDATA[<p>Kommt denn dieselbe Fehlermeldung, wenn du statt find_if(... operator ==), einfach nur find() verwendest? Aber dein Operator == sollte auf jeden Fall eine konstante Memberfunktion sein.<br />
Und welche gcc-version hast du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402530</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 13 Nov 2007 14:27:45 GMT</pubDate></item><item><title><![CDATA[Reply to [STL] Funktionszeiger von Memberfunktion on Wed, 14 Nov 2007 07:48:20 GMT]]></title><description><![CDATA[<p>Ich verwende g++ 3.4.4 unter Cygwin, wenn ich</p>
<pre><code class="language-cpp">std::find(..., mySearchString);
</code></pre>
<p>benutze geht es.</p>
<p>die Änderung auf</p>
<pre><code class="language-cpp">bool const&amp; operator==(std::string const&amp; rhs) const
</code></pre>
<p>hilft leider nicht, zumal dann die find-Variante nicht mehr funktioniert (Referenz auf temporäres Objekt).</p>
<p>Der oprerator == ist eine konstante Memberfunktion war nur im Testprogramm falsch drin <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="😞"
    /> trotz allem verstehe ich nicht warum das Testprogramm so nicht funktioniert. An Konstkorrektheit sollte es nicht scheitern <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/1402876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402876</guid><dc:creator><![CDATA[i_like_it]]></dc:creator><pubDate>Wed, 14 Nov 2007 07:48:20 GMT</pubDate></item><item><title><![CDATA[Reply to [STL] Funktionszeiger von Memberfunktion on Wed, 14 Nov 2007 08:08:56 GMT]]></title><description><![CDATA[<p><a href="http://www.boost.org/libs/functional/binders.html" rel="nofollow">boost::bind2nd</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402883</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Wed, 14 Nov 2007 08:08:56 GMT</pubDate></item><item><title><![CDATA[Reply to [STL] Funktionszeiger von Memberfunktion on Wed, 14 Nov 2007 08:21:48 GMT]]></title><description><![CDATA[<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Der boost-Link hat mir geholfen ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402890</guid><dc:creator><![CDATA[i_like_it]]></dc:creator><pubDate>Wed, 14 Nov 2007 08:21:48 GMT</pubDate></item></channel></rss>