<?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[Funktion als Template-Argument: wie zwischen 2 overloads unterschieden?]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich moechte einem boost::thread eine Funktion zum Ausfuehren mitgeben. Allerdings gibts von der Funktion 2 Overloads, und der GCC (4.1) kann anscheinend nicht entscheiden welche der beiden ich meine:</p>
<pre><code class="language-cpp">// das sind die funktionen:
template&lt;typename ParseReadsCallback&gt; void parse_reads(const std::string&amp; dir, ParseReadsCallback&amp; callback);
template&lt;typename ParseReadsCallback&gt; void parse_reads(const char* dir, ParseReadsCallback&amp; callback);

class ReadDetailsCallbacks
{
    operator() (...)  // callback fuer parse_reads

    ReadInfoMapPtr get_reads(const std::string&amp; foo)
    {
        string dir = ...
        thread t1(parse_mapping_short&lt;ReadDetailsCallbacks&gt;, dir, ref(*this));  // &lt;&lt;&lt;--- Hier passiert der Fehler!
    }
};
</code></pre>
<p>Und das ist die Fehlermeldung:</p>
<pre><code>error: no matching function for call to 'boost::thread::thread(&lt;unresolved overloaded function type&gt;, std::string&amp;, const boost::reference_wrapper&lt;ReadDetailsCallbacks&gt;)'
include/boost/thread/detail/thread.hpp:199: note: candidates are: boost::thread::thread(boost::detail::thread_move_t&lt;boost::thread&gt;)
include/boost/thread/detail/thread.hpp:147: note:                 boost::thread::thread()
include/boost/thread/detail/thread.hpp:118: note:                 boost::thread::thread(boost::detail::thread_data_ptr)
include/boost/thread/detail/thread.hpp:108: note:                 boost::thread::thread(boost::thread&amp;)
readdetails.cpp: In member function 'ReadInfoMapPtr ReadDetailsCallbacks::get_reads(const std::string&amp;)':
</code></pre>
<p>Wie kann ich dem GCC erklaeren, welche der 2 parse_reads()-overloads ich haben moechte?</p>
<p>EDIT: code-beispiel ausgeweitet damit die Fehlermeldungen mehr Sinn machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/255654/funktion-als-template-argument-wie-zwischen-2-overloads-unterschieden</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 22:54:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/255654.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 03 Dec 2009 12:50:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktion als Template-Argument: wie zwischen 2 overloads unterschieden? on Thu, 03 Dec 2009 12:55:12 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich moechte einem boost::thread eine Funktion zum Ausfuehren mitgeben. Allerdings gibts von der Funktion 2 Overloads, und der GCC (4.1) kann anscheinend nicht entscheiden welche der beiden ich meine:</p>
<pre><code class="language-cpp">// das sind die funktionen:
template&lt;typename ParseReadsCallback&gt; void parse_reads(const std::string&amp; dir, ParseReadsCallback&amp; callback);
template&lt;typename ParseReadsCallback&gt; void parse_reads(const char* dir, ParseReadsCallback&amp; callback);

class ReadDetailsCallbacks
{
    operator() (...)  // callback fuer parse_reads

    ReadInfoMapPtr get_reads(const std::string&amp; foo)
    {
        string dir = ...
        thread t1(parse_mapping_short&lt;ReadDetailsCallbacks&gt;, dir, ref(*this));  // &lt;&lt;&lt;--- Hier passiert der Fehler!
    }
};
</code></pre>
<p>Und das ist die Fehlermeldung:</p>
<pre><code>error: no matching function for call to 'boost::thread::thread(&lt;unresolved overloaded function type&gt;, std::string&amp;, const boost::reference_wrapper&lt;ReadDetailsCallbacks&gt;)'
include/boost/thread/detail/thread.hpp:199: note: candidates are: boost::thread::thread(boost::detail::thread_move_t&lt;boost::thread&gt;)
include/boost/thread/detail/thread.hpp:147: note:                 boost::thread::thread()
include/boost/thread/detail/thread.hpp:118: note:                 boost::thread::thread(boost::detail::thread_data_ptr)
include/boost/thread/detail/thread.hpp:108: note:                 boost::thread::thread(boost::thread&amp;)
readdetails.cpp: In member function 'ReadInfoMapPtr ReadDetailsCallbacks::get_reads(const std::string&amp;)':
</code></pre>
<p>Wie kann ich dem GCC erklaeren, welche der 2 parse_reads()-overloads ich haben moechte?</p>
<p>EDIT: code-beispiel ausgeweitet damit die Fehlermeldungen mehr Sinn machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817089</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Thu, 03 Dec 2009 12:55:12 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Template-Argument: wie zwischen 2 overloads unterschieden? on Thu, 03 Dec 2009 13:06:10 GMT]]></title><description><![CDATA[<p>Du musst die parameter mit bind &quot;binden&quot; damit eine aufrufbare funktion entsteht.<br />
Du brauchst ein boost::function&lt;void()&gt; das du übergibst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817100</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Thu, 03 Dec 2009 13:06:10 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Template-Argument: wie zwischen 2 overloads unterschieden? on Thu, 03 Dec 2009 13:10:34 GMT]]></title><description><![CDATA[<p>evilissimo schrieb:</p>
<blockquote>
<p>Du musst die parameter mit bind &quot;binden&quot; damit eine aufrufbare funktion entsteht.<br />
Du brauchst ein boost::function&lt;void()&gt; das du übergibst.</p>
</blockquote>
<p>D.h. es gibt keinen Weg, wie man das mit &quot;reinem C++&quot; loest (d.h. ohne boost::function)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817103</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Thu, 03 Dec 2009 13:10:34 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Template-Argument: wie zwischen 2 overloads unterschieden? on Thu, 03 Dec 2009 13:15:40 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>evilissimo schrieb:</p>
<blockquote>
<p>Du musst die parameter mit bind &quot;binden&quot; damit eine aufrufbare funktion entsteht.<br />
Du brauchst ein boost::function&lt;void()&gt; das du übergibst.</p>
</blockquote>
<p>D.h. es gibt keinen Weg, wie man das mit &quot;reinem C++&quot; loest (d.h. ohne boost::function)?</p>
</blockquote>
<p>natürlich gibt es den aber es ist umständlich ausserdem erwartet der thread constructor ein function object oder etwas das dorthin transformierbar ist. Das bedeutet deine Fehlermeldung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817105</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Thu, 03 Dec 2009 13:15:40 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Template-Argument: wie zwischen 2 overloads unterschieden? on Thu, 03 Dec 2009 16:06:30 GMT]]></title><description><![CDATA[<p>Blue-Tiger schrieb:</p>
<blockquote>
<p>Ich moechte einem boost::thread eine Funktion zum Ausfuehren mitgeben. Allerdings gibts von der Funktion 2 Overloads, und der GCC (4.1) kann anscheinend nicht entscheiden welche der beiden ich meine:</p>
<pre><code class="language-cpp">// das sind die funktionen:
template&lt;typename ParseReadsCallback&gt;
void parse_reads(const std::string&amp; dir, ParseReadsCallback&amp; callback);

template&lt;typename ParseReadsCallback&gt;
void parse_reads(const char* dir, ParseReadsCallback&amp; callback);

class ReadDetailsCallbacks
{
    operator() (...)  // callback fuer parse_reads

    ReadInfoMapPtr get_reads(const std::string&amp; foo)
    {
        string dir = ...
        thread t1(parse_mapping_short&lt;ReadDetailsCallbacks&gt;,
            dir, ref(*this));
    }
};
</code></pre>
</blockquote>
<p>Du meintest sicherlich parse_reads und nicht parse_mapping_short, ja?</p>
<p>Ok, das ist halb so schlimm. Der Grund, warum's nicht geht ist, wie Du schon erkannt hast, dass das Funktionstemplate überladen ist. Daher bezeichnet parse_reads&lt;ReadDetailsCallbacks&gt; eine Menge von 2 Funktionsspezialisierungen. Eine solche Menge kann aber nicht für die &quot;Template-Argument-Deduction&quot; verwendet werden. &quot;Template-Argument-Deduction&quot; (TAD) muss hier aber stattfinden, weil Du einem Konstruktortemplate (in diesem Fall den vom boost::thread) die Template-Parameter nicht explizit mitgeben kannst. Lösen kann man das, indem Du Dir zB eine Zeigervariable für die Funktion anlegst:</p>
<pre><code class="language-cpp">void (*funptr)(const std::string&amp;, ReadDetailsCallback) =
   parse_reads&lt;ReadDetailsCallbacks&gt;;  // 1
thread t1(funptr, dir, ref(*this));    // 2
</code></pre>
<p>1. hier kann der Compiler aus der Menge der Funktionen die richtige rausfischen, die zum Funktionszeiger-Typen passt.<br />
2. TAD funktioniert, da der Typ von funptr bekannt ist.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817195</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Thu, 03 Dec 2009 16:06:30 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion als Template-Argument: wie zwischen 2 overloads unterschieden? on Thu, 03 Dec 2009 16:56:39 GMT]]></title><description><![CDATA[<p>thx euch beiden! <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="🙂"
    /></p>
<p>Die Loesung von Sebastian funkioniert und erspart mir das Lesen der boost::bind doku <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/1817235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817235</guid><dc:creator><![CDATA[Blue-Tiger]]></dc:creator><pubDate>Thu, 03 Dec 2009 16:56:39 GMT</pubDate></item></channel></rss>