<?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[Probleme mit bind und member templates]]></title><description><![CDATA[<p>Hiho,</p>
<p>folgender Code, der das Problem aufzeigt:</p>
<p>#include &quot;stdafx.h&quot;</p>
<pre><code>#include &lt;iostream&gt;

#include &lt;conio.h&gt;
#include &lt;memory&gt;

#include &lt;boost/thread.hpp&gt;

//
struct Teststruct
{
	void foo() { std::cout &lt;&lt; &quot;foohooo&quot; &lt;&lt; std::endl; }
};

//
void funcFoo()
{
	std::cout &lt;&lt; &quot;Func foohooo&quot; &lt;&lt; std::endl;
}

//
class CCycleThread : boost::noncopyable
{
	public:
		/******************************************************************************/
		/* constructor                                                                */
		/******************************************************************************/
		template&lt;typename T&gt;
		CCycleThread(T&amp; t)
		{					
			m_thread.reset(new boost::thread(boost::bind(&amp;CCycleThread::execute&lt;T&gt;,this,t)));
		}

	private:				
		/******************************************************************************/
		/*  thread method                                                             */
		/******************************************************************************/
		template&lt;typename T&gt;
		void execute(T t)
		{
			for(;;) t();
		}

		//
		std::unique_ptr &lt;boost::thread&gt; m_thread;
};

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

	//
	CCycleThread cycleThread(funcFoo);  //compiles

	CCycleThread anotherCycleThread(boost::bind(&amp;Teststruct::foo,&amp;testObj)); //compiles not

	_getch();

	return 0;
}
</code></pre>
<p>Das ganze führt zu einem Compilefehler im Visual Studio 2010:</p>
<blockquote>
<blockquote>
<p>d:\quellcode\boost\boost_1_48_0\boost\bind\bind.hpp(313): error C2664: 'R boost::_mfi::mf1&lt;R,T,A1&gt;::operator ()&lt;CCycleThread&gt;(const U &amp;,A1) const': Konvertierung des Parameters 2 von 'void' in 'boost::_bi::bind_t&lt;R,F,L&gt;' nicht möglich<br />
1&gt; with<br />
1&gt; [<br />
1&gt; R=void,<br />
1&gt; T=CCycleThread,<br />
1&gt; A1=boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;,<br />
1&gt; U=CCycleThread *<br />
1&gt; ]<br />
1&gt; and<br />
1&gt; [<br />
1&gt; R=void,<br />
1&gt; F=boost::_mfi::mf0&lt;void,Teststruct&gt;,<br />
1&gt; L=boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;<br />
1&gt; ]<br />
1&gt; Ausdruck vom Typ void kann nicht in andere Typen konvertiert werden<br />
1&gt; d:\quellcode\boost\boost_1_48_0\boost\bind\bind_template.hpp(20): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void boost::_bi::list2&lt;A1,A2&gt;::operator ()&lt;F,boost::_bi::list0&gt;(boost::_bi::type&lt;T&gt;,F &amp;,A &amp;,int)&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; A1=boost::_bi::value&lt;CCycleThread *&gt;,<br />
1&gt; A2=boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;,<br />
1&gt; F=boost::_mfi::mf1&lt;void,CCycleThread,boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;&gt;,<br />
1&gt; T=void,<br />
1&gt; A=boost::_bi::list0<br />
1&gt; ]<br />
1&gt; d:\quellcode\boost\boost_1_48_0\boost\bind\bind_template.hpp(18): Bei der Kompilierung der Klassen-template der void boost::_bi::bind_t&lt;R,F,L&gt;::operator ()(void)-Memberfunktion<br />
1&gt; with<br />
1&gt; [<br />
1&gt; R=void,<br />
1&gt; F=boost::_mfi::mf1&lt;void,CCycleThread,boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;&gt;,<br />
1&gt; L=boost::_bi::list2&lt;boost::_bi::value&lt;CCycleThread *&gt;,boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;&gt;<br />
1&gt; ]<br />
1&gt; d:\users\mschumi\desktop\test\test\test.cpp(36): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;boost::_bi::bind_t&lt;R,F,L&gt;&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; R=void,<br />
1&gt; F=boost::_mfi::mf1&lt;void,CCycleThread,boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;&gt;,<br />
1&gt; L=boost::_bi::list2&lt;boost::_bi::value&lt;CCycleThread *&gt;,boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;&gt;<br />
1&gt; ]<br />
1&gt; d:\users\mschumi\desktop\test\test\test.cpp(62): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;CCycleThread::CCycleThread&lt;boost::_bi::bind_t&lt;R,F,L&gt;&gt;(T &amp;)&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; R=void,<br />
1&gt; F=boost::_mfi::mf0&lt;void,Teststruct&gt;,<br />
1&gt; L=boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;,<br />
1&gt; T=boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;<br />
1&gt; ]</p>
</blockquote>
</blockquote>
<p>Benutze ich nun einmal boost::bind und einmal std::bind, dann kompiliert er. Habe ich da irgendwo einen Fehler, oder ist das ein Compilerproblem?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301192/probleme-mit-bind-und-member-templates</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 03:36:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301192.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 21 Mar 2012 14:43:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit bind und member templates on Wed, 21 Mar 2012 14:43:34 GMT]]></title><description><![CDATA[<p>Hiho,</p>
<p>folgender Code, der das Problem aufzeigt:</p>
<p>#include &quot;stdafx.h&quot;</p>
<pre><code>#include &lt;iostream&gt;

#include &lt;conio.h&gt;
#include &lt;memory&gt;

#include &lt;boost/thread.hpp&gt;

//
struct Teststruct
{
	void foo() { std::cout &lt;&lt; &quot;foohooo&quot; &lt;&lt; std::endl; }
};

//
void funcFoo()
{
	std::cout &lt;&lt; &quot;Func foohooo&quot; &lt;&lt; std::endl;
}

//
class CCycleThread : boost::noncopyable
{
	public:
		/******************************************************************************/
		/* constructor                                                                */
		/******************************************************************************/
		template&lt;typename T&gt;
		CCycleThread(T&amp; t)
		{					
			m_thread.reset(new boost::thread(boost::bind(&amp;CCycleThread::execute&lt;T&gt;,this,t)));
		}

	private:				
		/******************************************************************************/
		/*  thread method                                                             */
		/******************************************************************************/
		template&lt;typename T&gt;
		void execute(T t)
		{
			for(;;) t();
		}

		//
		std::unique_ptr &lt;boost::thread&gt; m_thread;
};

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

	//
	CCycleThread cycleThread(funcFoo);  //compiles

	CCycleThread anotherCycleThread(boost::bind(&amp;Teststruct::foo,&amp;testObj)); //compiles not

	_getch();

	return 0;
}
</code></pre>
<p>Das ganze führt zu einem Compilefehler im Visual Studio 2010:</p>
<blockquote>
<blockquote>
<p>d:\quellcode\boost\boost_1_48_0\boost\bind\bind.hpp(313): error C2664: 'R boost::_mfi::mf1&lt;R,T,A1&gt;::operator ()&lt;CCycleThread&gt;(const U &amp;,A1) const': Konvertierung des Parameters 2 von 'void' in 'boost::_bi::bind_t&lt;R,F,L&gt;' nicht möglich<br />
1&gt; with<br />
1&gt; [<br />
1&gt; R=void,<br />
1&gt; T=CCycleThread,<br />
1&gt; A1=boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;,<br />
1&gt; U=CCycleThread *<br />
1&gt; ]<br />
1&gt; and<br />
1&gt; [<br />
1&gt; R=void,<br />
1&gt; F=boost::_mfi::mf0&lt;void,Teststruct&gt;,<br />
1&gt; L=boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;<br />
1&gt; ]<br />
1&gt; Ausdruck vom Typ void kann nicht in andere Typen konvertiert werden<br />
1&gt; d:\quellcode\boost\boost_1_48_0\boost\bind\bind_template.hpp(20): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;void boost::_bi::list2&lt;A1,A2&gt;::operator ()&lt;F,boost::_bi::list0&gt;(boost::_bi::type&lt;T&gt;,F &amp;,A &amp;,int)&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; A1=boost::_bi::value&lt;CCycleThread *&gt;,<br />
1&gt; A2=boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;,<br />
1&gt; F=boost::_mfi::mf1&lt;void,CCycleThread,boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;&gt;,<br />
1&gt; T=void,<br />
1&gt; A=boost::_bi::list0<br />
1&gt; ]<br />
1&gt; d:\quellcode\boost\boost_1_48_0\boost\bind\bind_template.hpp(18): Bei der Kompilierung der Klassen-template der void boost::_bi::bind_t&lt;R,F,L&gt;::operator ()(void)-Memberfunktion<br />
1&gt; with<br />
1&gt; [<br />
1&gt; R=void,<br />
1&gt; F=boost::_mfi::mf1&lt;void,CCycleThread,boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;&gt;,<br />
1&gt; L=boost::_bi::list2&lt;boost::_bi::value&lt;CCycleThread *&gt;,boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;&gt;<br />
1&gt; ]<br />
1&gt; d:\users\mschumi\desktop\test\test\test.cpp(36): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;boost::_bi::bind_t&lt;R,F,L&gt;&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; R=void,<br />
1&gt; F=boost::_mfi::mf1&lt;void,CCycleThread,boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;&gt;,<br />
1&gt; L=boost::_bi::list2&lt;boost::_bi::value&lt;CCycleThread *&gt;,boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;&gt;<br />
1&gt; ]<br />
1&gt; d:\users\mschumi\desktop\test\test\test.cpp(62): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template &quot;CCycleThread::CCycleThread&lt;boost::_bi::bind_t&lt;R,F,L&gt;&gt;(T &amp;)&quot;.<br />
1&gt; with<br />
1&gt; [<br />
1&gt; R=void,<br />
1&gt; F=boost::_mfi::mf0&lt;void,Teststruct&gt;,<br />
1&gt; L=boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;,<br />
1&gt; T=boost::_bi::bind_t&lt;void,boost::_mfi::mf0&lt;void,Teststruct&gt;,boost::_bi::list1&lt;boost::_bi::value&lt;Teststruct *&gt;&gt;&gt;<br />
1&gt; ]</p>
</blockquote>
</blockquote>
<p>Benutze ich nun einmal boost::bind und einmal std::bind, dann kompiliert er. Habe ich da irgendwo einen Fehler, oder ist das ein Compilerproblem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193703</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Wed, 21 Mar 2012 14:43:34 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit bind und member templates on Wed, 21 Mar 2012 15:51:57 GMT]]></title><description><![CDATA[<p>rvalues an T&amp; zu binden, funktioniert nicht so gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193731</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 21 Mar 2012 15:51:57 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit bind und member templates on Wed, 21 Mar 2012 16:13:22 GMT]]></title><description><![CDATA[<p>wenn ich ein T anstatt T&amp; mache, kompiliert es trotzdem nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193741</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Wed, 21 Mar 2012 16:13:22 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit bind und member templates on Thu, 22 Mar 2012 13:39:26 GMT]]></title><description><![CDATA[<p>Hiho,</p>
<p>Wenn ich die 2. Member Template-Methode entferne und boost::function benutzt, funktioniert es. Trotzdem würde mich sehr interessieren, warum die ursprüngliche Fassung nicht geht (und mit 2 unterschiedlichen bind Typen dann doch auf einmal kompiliert)</p>
<pre><code>class CCycleThread : boost::noncopyable
{
	public:
		/******************************************************************************/
		/* constructor                                                                */
		/******************************************************************************/
		template&lt;typename T&gt;
		CCycleThread(T t) : m_threadFunc(t)
		{			
			m_thread.reset(new boost::thread(boost::bind(&amp;CCycleThread::execute,this)));
		}

	private:				
		/******************************************************************************/
		/*  thread method                                                             */
		/******************************************************************************/		
		void execute()
		{
			for(;;) m_threadFunc();
		}		

		//
		boost::function&lt;void ()&gt; m_threadFunc;
		//
		std::unique_ptr &lt;boost::thread&gt; m_thread;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2194150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2194150</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Thu, 22 Mar 2012 13:39:26 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit bind und member templates on Fri, 23 Mar 2012 06:58:00 GMT]]></title><description><![CDATA[<p>So, in der boost mailing list wurde mit der Fehler erläuert: boost::bind-Objekte kann man nesten. Dabei geht die Klasse soweit, dass genestete bind-Objekte ausgewertet werden:</p>
<p>bind(f,_1,bind(g,_1));</p>
<p>D. h. das Binding von g wird ausgeführt und der <strong>Rückgabetyp</strong> wird an das äußere bind durchgeleitet. Mein Code ging aber davon aus, dass das komplette bind-Objekt durchgeleitet/kopiert wird und nicht das Ergebnis des binds, das ist in meinem obigen Fall void, daher der Compilefehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2194454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2194454</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Fri, 23 Mar 2012 06:58:00 GMT</pubDate></item></channel></rss>