<?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[Funktor als Default-Argument]]></title><description><![CDATA[<p>Warum geht das folgende nicht?</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;

template &lt;typename T, typename PRED&gt;
void Test(T data, PRED pred = std::less&lt;T&gt;())
{
}

int main()
{
   Test(12);
   return 0;
}
</code></pre>
<p>Funktioniert nicht auf: VC8, VC6, Comeau mit untershciedlichen Fehlermeldungen (VC8 liefert noch die genaueste: typ des template-parameters konnte nicht hergeleitet werden)</p>
<p>Mit einem zzweiten overload kann man das zwar fixen (die meisten STL-Impelementaitonen sheinen's ja so zu machen), aber ich bin neugierig ob der C++-Standard das verbietet, oder das nur ein Compiler-Problem ist.</p>
<p>Dankeschön im voraus <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/163828/funktor-als-default-argument</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 11:43:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/163828.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 02 Nov 2006 09:43:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktor als Default-Argument on Thu, 02 Nov 2006 09:43:47 GMT]]></title><description><![CDATA[<p>Warum geht das folgende nicht?</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;

template &lt;typename T, typename PRED&gt;
void Test(T data, PRED pred = std::less&lt;T&gt;())
{
}

int main()
{
   Test(12);
   return 0;
}
</code></pre>
<p>Funktioniert nicht auf: VC8, VC6, Comeau mit untershciedlichen Fehlermeldungen (VC8 liefert noch die genaueste: typ des template-parameters konnte nicht hergeleitet werden)</p>
<p>Mit einem zzweiten overload kann man das zwar fixen (die meisten STL-Impelementaitonen sheinen's ja so zu machen), aber ich bin neugierig ob der C++-Standard das verbietet, oder das nur ein Compiler-Problem ist.</p>
<p>Dankeschön im voraus <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1166766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166766</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Thu, 02 Nov 2006 09:43:47 GMT</pubDate></item><item><title><![CDATA[Reply to Funktor als Default-Argument on Thu, 02 Nov 2006 09:51:09 GMT]]></title><description><![CDATA[<p>Der Compiler muß ja erkennen, welche Version deiner Funktion er erzeugen muß - und dazu verwendet er die Typ-Informationen aus dem Aufruf. Bei Default-Argumenten kann er jedoch nichts aus dem Aufruf ermitteln (weil sie dort nicht da sind), deshalb muß er diese Typen vorher kennen.<br />
(davon abgesehen, daß dein Default-Parameter nicht mit jedem PRED-Typ verträglich sein dürfte)</p>
<p>Die Lösung hast du ja schon genannt - die zusätzliche Überladung dürfte imho die beste Möglichkeit dafür sein:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
void Test(T data)
{
  //vergleicht mit &lt;
}

template&lt;typename T,typename PRED&gt;
void Test(T data, PRED pred)
{
  //vergleicht mit pred.operator()
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1166772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166772</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 02 Nov 2006 09:51:09 GMT</pubDate></item><item><title><![CDATA[Reply to Funktor als Default-Argument on Thu, 02 Nov 2006 09:55:16 GMT]]></title><description><![CDATA[<p>EDIT: war quatsch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166775</guid><dc:creator><![CDATA[Konstruktör]]></dc:creator><pubDate>Thu, 02 Nov 2006 09:55:16 GMT</pubDate></item><item><title><![CDATA[Reply to Funktor als Default-Argument on Thu, 02 Nov 2006 10:26:21 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
void Test(T data)
{
  //vergleicht mit &lt;
}

template&lt;typename T,typename PRED&gt;
void Test(T data, PRED pred)
{
  //vergleicht mit pred.operator()
}
</code></pre>
</blockquote>
<p>Hi,</p>
<p>geht nicht auch</p>
<pre><code class="language-cpp">template&lt;typename T,typename PRED = std::less&lt;T&gt; &gt;
void Test(T data, PRED pred)
{}
</code></pre>
<p>?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166814</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 02 Nov 2006 10:26:21 GMT</pubDate></item><item><title><![CDATA[Reply to Funktor als Default-Argument on Thu, 02 Nov 2006 10:28:58 GMT]]></title><description><![CDATA[<p>Sicher geht das, bringt nur nichts - für die Funktion mußt du sowieso beide Parameter angeben und dann überschreibt die automatische Typdetektion den Dafaultwert für PRED.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166819</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 02 Nov 2006 10:28:58 GMT</pubDate></item><item><title><![CDATA[Reply to Funktor als Default-Argument on Thu, 02 Nov 2006 11:03:24 GMT]]></title><description><![CDATA[<p>g++ schrieb:</p>
<blockquote>
<pre><code>default template arguments may not be used in function templates
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1166844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166844</guid><dc:creator><![CDATA[Konstruktör]]></dc:creator><pubDate>Thu, 02 Nov 2006 11:03:24 GMT</pubDate></item><item><title><![CDATA[Reply to Funktor als Default-Argument on Thu, 02 Nov 2006 11:06:12 GMT]]></title><description><![CDATA[<p>Für default Template-Argumente kann man sich einen Funktor basteln:</p>
<pre><code class="language-cpp">#include &lt;functional&gt;
#include &lt;iostream&gt;

template&lt;template&lt;typename&gt; class TPred = std::less&gt;
struct tester
{
    template&lt;typename T&gt;
    void operator()(T data)
    {
        std::cout &lt;&lt; (TPred&lt;T&gt;()(data,15)?&quot;ja&quot;:&quot;nein&quot;) &lt;&lt; std::endl;
    }
};

int main()
{
   tester&lt;&gt; t;
   t(12);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1166848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166848</guid><dc:creator><![CDATA[Konstruktör]]></dc:creator><pubDate>Thu, 02 Nov 2006 11:06:12 GMT</pubDate></item><item><title><![CDATA[Reply to Funktor als Default-Argument on Thu, 02 Nov 2006 12:47:45 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Sicher geht das, bringt nur nichts - für die Funktion mußt du sowieso beide Parameter angeben und dann überschreibt die automatische Typdetektion den Dafaultwert für PRED.</p>
</blockquote>
<p>*hand-vor-die-stirn-klatsch*<br />
Stimmt !<br />
Hat ein bischen gedauert, bis ich's gepeilt habe, aber nun ist's mir klar.</p>
<p>Danke,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166925</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 02 Nov 2006 12:47:45 GMT</pubDate></item></channel></rss>