<?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[Pointer auf Member-Funktion und Templates (und ein aelterer Compiler?)]]></title><description><![CDATA[<p>Hi, ich hab ein kleines Problem mit folgendem:</p>
<p>Ich moechte einer Funktion (dem Ctor eines boost::thread, um genau zu sein) eine Memberfunktion als Callback mitgeben. Sowohl die Memberfunktion als auch die die Klasse an sich sind Templates.</p>
<p>Nach viel rumprobieren hat folgendes Construct als funktionierend Herausgestellt:</p>
<pre><code class="language-cpp">template&lt;class T&gt; class SynchronizedQueue
{
	public:
		template&lt;class ExecuteFunction&gt;
		void process(unsigned n_threads, ExecuteFunction func)
		{
			boost::ptr_vector&lt;boost::thread&gt; threads;
			boost::function&lt;void ()&gt; f;
			f = boost::bind(&amp;SynchronizedQueue&lt;T&gt;::run&lt;ExecuteFunction&gt;, this, func); &lt;--- Zeile 41
			for (unsigned i = 0; i &lt; n_threads; ++i)
				threads.push_back(new boost::thread(f));

			foreach (boost::thread&amp; t, threads)
				t.join();
		}

		template&lt;class ExecuteFunction&gt;
		void run(ExecuteFunction&amp; func)
		{ /* ... */ }
};
</code></pre>
<p>Soweit so gut, mein Compiler daheim (GCC 4.4.1) schluckt das, ich war gluecklich. Leider <strong>muss</strong> der Code auf einer anderen Maschine kompiliert und ausgefuehrt werden, die nur den GCC 4.1.0 oben hat. Dieser meckert:</p>
<pre><code>ynchronizedQueue.h: In member function 'void SynchronizedQueue&lt;T&gt;::process(unsigned int, ExecuteFunction)':
SynchronizedQueue.h:41: error: expected primary-expression before '&gt;' token
SynchronizedQueue.h:41: error: expected primary-expression before ',' token
</code></pre>
<p>Leider hab ich keinen Einfluss auf den Compiler auf der Maschine, der Code <strong>muss</strong> damit kompiliert werden(also bitte keine Vorschlaege der Art &quot;installier doch 'ne neuere Compilerversion&quot;). Wie kann ich den Code umschreiben, so dass er auch auf dem GCC 4.1 rennt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/252549/pointer-auf-member-funktion-und-templates-und-ein-aelterer-compiler</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 08:33:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/252549.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 21 Oct 2009 12:40:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer auf Member-Funktion und Templates (und ein aelterer Compiler?) on Wed, 21 Oct 2009 12:40:23 GMT]]></title><description><![CDATA[<p>Hi, ich hab ein kleines Problem mit folgendem:</p>
<p>Ich moechte einer Funktion (dem Ctor eines boost::thread, um genau zu sein) eine Memberfunktion als Callback mitgeben. Sowohl die Memberfunktion als auch die die Klasse an sich sind Templates.</p>
<p>Nach viel rumprobieren hat folgendes Construct als funktionierend Herausgestellt:</p>
<pre><code class="language-cpp">template&lt;class T&gt; class SynchronizedQueue
{
	public:
		template&lt;class ExecuteFunction&gt;
		void process(unsigned n_threads, ExecuteFunction func)
		{
			boost::ptr_vector&lt;boost::thread&gt; threads;
			boost::function&lt;void ()&gt; f;
			f = boost::bind(&amp;SynchronizedQueue&lt;T&gt;::run&lt;ExecuteFunction&gt;, this, func); &lt;--- Zeile 41
			for (unsigned i = 0; i &lt; n_threads; ++i)
				threads.push_back(new boost::thread(f));

			foreach (boost::thread&amp; t, threads)
				t.join();
		}

		template&lt;class ExecuteFunction&gt;
		void run(ExecuteFunction&amp; func)
		{ /* ... */ }
};
</code></pre>
<p>Soweit so gut, mein Compiler daheim (GCC 4.4.1) schluckt das, ich war gluecklich. Leider <strong>muss</strong> der Code auf einer anderen Maschine kompiliert und ausgefuehrt werden, die nur den GCC 4.1.0 oben hat. Dieser meckert:</p>
<pre><code>ynchronizedQueue.h: In member function 'void SynchronizedQueue&lt;T&gt;::process(unsigned int, ExecuteFunction)':
SynchronizedQueue.h:41: error: expected primary-expression before '&gt;' token
SynchronizedQueue.h:41: error: expected primary-expression before ',' token
</code></pre>
<p>Leider hab ich keinen Einfluss auf den Compiler auf der Maschine, der Code <strong>muss</strong> damit kompiliert werden(also bitte keine Vorschlaege der Art &quot;installier doch 'ne neuere Compilerversion&quot;). Wie kann ich den Code umschreiben, so dass er auch auf dem GCC 4.1 rennt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1795781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1795781</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Wed, 21 Oct 2009 12:40:23 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Member-Funktion und Templates (und ein aelterer Compiler?) on Wed, 21 Oct 2009 12:46:22 GMT]]></title><description><![CDATA[<p>es fehlt mal wieder template:</p>
<pre><code class="language-cpp">f = boost::bind(&amp;SynchronizedQueue&lt;T&gt;::template run&lt;ExecuteFunction&gt;, this, func);
</code></pre>
<p>run ist ein abhängiger Name und ohne Kenntnis von T könnte das auch z.B. ein Objekt sein, das folgende &lt; dann der ganz normale kleiner-als-Operator.<br />
Ich bin etwas überrascht, dass der gcc 4.4.1 das schlucken soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1795785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1795785</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 21 Oct 2009 12:46:22 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Member-Funktion und Templates (und ein aelterer Compiler?) on Wed, 21 Oct 2009 12:50:07 GMT]]></title><description><![CDATA[<p>Thanks a lot <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="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1795789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1795789</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Wed, 21 Oct 2009 12:50:07 GMT</pubDate></item></channel></rss>