<?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[Funktionstemplate-Magie - sehe die Überladung nicht.]]></title><description><![CDATA[<p>Ich spiele grade ein wenig mit Methodentemplates herum, folgender Code:</p>
<pre><code class="language-cpp">struct Dummy { 
  static Dummy DUMMYvoid(void) { return Dummy(); }

  typedef Dummy (*voidCreator)(void);
  template &lt;voidCreator&gt; void get() const;      //17
  template&lt;&gt; void get&lt;&amp;DUMMYvoid&gt;() const {}

  static Dummy DUMMYint(int) { return Dummy(); }

  typedef Dummy (*intCreator)(int);
  template &lt;intCreator&gt; int get() const; 
  template&lt;&gt; int get&lt;&amp;DUMMYint&gt;() const {}      //24
};

int main()
{
  auto di = Dummy::DUMMYint(10);   
  auto x = intevt.get&lt;Dummy::DUMMYint&gt;(); //line 46
  assert(x == 10);
}
</code></pre>
<p>Compilerfehler:</p>
<pre><code>2&gt;test.cpp(46): error C2668: 'Dummy::get' : ambiguous call to overloaded function
2&gt;test.cpp(24): could be 'int Dummy::get&lt;Dummy Dummy::DUMMYint(int)&gt;(void) const'
2&gt;test.cpp(17): or       'void Dummy::get&lt;Dummy Dummy::DUMMYint(int)&gt;(void) const'
2&gt;          while trying to match the argument list '(void)'
</code></pre>
<p>Ich kapier nicht ganz, wo der Compiler da die zweideutigkeit sieht, schließlich ist DUMMYint vom Typ Dummy(int) und nicht vom Typ Dummy(void), also passt für Zeile 17 der Parameter doch garnicht. Wo ist der Haken?</p>
<p>Hintergrund: ich möchte ein Objekt mit einer Erzeugerfunktion erzeugen, und dann später mit der Get-Funktion herausbekommen, was auch immer ich der Erzeugerfunktion als Parameter mitgegeben habe. Den Rückgabetyp von get möchte ich (anders als z.B. boost::any) nicht direkt bestimmen sondern indirekt durch Übergabe des Funktoinspointers der Erzeugerfunktion.</p>
<p>Klingt jetzt wirr, aber vielleicht verstehts ja jemand <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="😉"
    /><br />
Alternative Ideen sind auch immer wollkommen <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/303277/funktionstemplate-magie-sehe-die-überladung-nicht</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 15:43:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303277.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 May 2012 17:31:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Wed, 09 May 2012 17:32:38 GMT]]></title><description><![CDATA[<p>Ich spiele grade ein wenig mit Methodentemplates herum, folgender Code:</p>
<pre><code class="language-cpp">struct Dummy { 
  static Dummy DUMMYvoid(void) { return Dummy(); }

  typedef Dummy (*voidCreator)(void);
  template &lt;voidCreator&gt; void get() const;      //17
  template&lt;&gt; void get&lt;&amp;DUMMYvoid&gt;() const {}

  static Dummy DUMMYint(int) { return Dummy(); }

  typedef Dummy (*intCreator)(int);
  template &lt;intCreator&gt; int get() const; 
  template&lt;&gt; int get&lt;&amp;DUMMYint&gt;() const {}      //24
};

int main()
{
  auto di = Dummy::DUMMYint(10);   
  auto x = intevt.get&lt;Dummy::DUMMYint&gt;(); //line 46
  assert(x == 10);
}
</code></pre>
<p>Compilerfehler:</p>
<pre><code>2&gt;test.cpp(46): error C2668: 'Dummy::get' : ambiguous call to overloaded function
2&gt;test.cpp(24): could be 'int Dummy::get&lt;Dummy Dummy::DUMMYint(int)&gt;(void) const'
2&gt;test.cpp(17): or       'void Dummy::get&lt;Dummy Dummy::DUMMYint(int)&gt;(void) const'
2&gt;          while trying to match the argument list '(void)'
</code></pre>
<p>Ich kapier nicht ganz, wo der Compiler da die zweideutigkeit sieht, schließlich ist DUMMYint vom Typ Dummy(int) und nicht vom Typ Dummy(void), also passt für Zeile 17 der Parameter doch garnicht. Wo ist der Haken?</p>
<p>Hintergrund: ich möchte ein Objekt mit einer Erzeugerfunktion erzeugen, und dann später mit der Get-Funktion herausbekommen, was auch immer ich der Erzeugerfunktion als Parameter mitgegeben habe. Den Rückgabetyp von get möchte ich (anders als z.B. boost::any) nicht direkt bestimmen sondern indirekt durch Übergabe des Funktoinspointers der Erzeugerfunktion.</p>
<p>Klingt jetzt wirr, aber vielleicht verstehts ja jemand <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="😉"
    /><br />
Alternative Ideen sind auch immer wollkommen <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/2209953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209953</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 09 May 2012 17:32:38 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Wed, 09 May 2012 17:43:16 GMT]]></title><description><![CDATA[<p>Memberfunktionen zu spezialisieren ist schlicht und ergreifend nicht erlaubt.<br />
<a href="http://ideone.com/WKRSq" rel="nofollow">http://ideone.com/WKRSq</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2209958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209958</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 09 May 2012 17:43:16 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Wed, 09 May 2012 17:42:55 GMT]]></title><description><![CDATA[<pre><code>./main.cpp:6:12: Fehler: explizite Spezialisierung in Gültigkeitsbereich des Nicht-Namensbereiches »struct Dummy«
./main.cpp:6:37: Fehler: Template-ID »get&lt;Dummy::DUMMYvoid&gt;« in Deklaration des ersten Templates
./main.cpp:11:29: Fehler: zu viele Templateparameterlisten
./main.cpp:12:12: Fehler: explizite Spezialisierung in Gültigkeitsbereich des Nicht-Namensbereiches »struct Dummy«
./main.cpp:12:35: Fehler: Template-ID »get&lt;Dummy::DUMMYint&gt;« in Deklaration des ersten Templates
./main.cpp:12:18: Fehler: »int Dummy::get() const« kann nicht überladen werden
./main.cpp:6:19: Fehler: mit »void Dummy::get() const«
./main.cpp: In Elementfunktion »int Dummy::get() const«:
./main.cpp:12:42: Warnung: keine return-Anweisung in nicht void zurückgebender Funktion [-Wreturn-type]
./main.cpp: In Funktion »int main()«:
./main.cpp:19:12: Fehler: »intevt« wurde in diesem Gültigkeitsbereich nicht definiert
./main.cpp:19:40: Fehler: expected primary-expression before »)« token
./main.cpp:19:40: Fehler: »auto« kann nicht aus »&lt;Ausdrucksfehler&gt;« hergeleitet werden
./main.cpp:20:17: Fehler: »assert« wurde in diesem Gültigkeitsbereich nicht definiert
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2209961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209961</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 09 May 2012 17:42:55 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Wed, 09 May 2012 17:47:37 GMT]]></title><description><![CDATA[<p>Edit: Hab den Fehler nicht geleesen, sry <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2209963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209963</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 09 May 2012 17:47:37 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Wed, 09 May 2012 17:55:45 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Memberfunktionen zu spezialisieren ist schlicht und ergreifend nicht erlaubt.<br />
<a href="http://ideone.com/WKRSq" rel="nofollow">http://ideone.com/WKRSq</a></p>
</blockquote>
<p>Gnarf. Okay. Wie dumm von mir, danke für den Hinweis *kopf-&gt;tisch*</p>
<p>Nächster Versuch, vieeel einfacher (dachte ich):</p>
<pre><code class="language-cpp">struct Dummy { 
  template &lt;class T&gt;
  typename std::enable_if&lt;!std::is_same&lt;T, void&gt;::value, T&gt;::type get(Dummy (*)(T)) 
  { return T();}

  static Dummy DUMMYvoid(void) { return Dummy(); }
  static Dummy DUMMYint(int) { return Dummy(); }
};

int main()
{
  auto di = Dummy::DUMMYint(10);
  auto x = di.get(Dummy::DUMMYint);
  assert(x == 10);
}
</code></pre>
<p>Fehlermeldung:</p>
<pre><code>2&gt;test.cpp(46): error C2664: 'int Dummy::get&lt;int&gt;(Dummy (__cdecl *)(T))' : cannot convert parameter 1 from 'Dummy (__cdecl *)(int)' to 'Dummy (__cdecl *)(T)'
2&gt;          with
2&gt;          [
2&gt;              T=int
2&gt;          ]
2&gt;          Incompatible calling conventions for UDT return value
</code></pre>
<p>Is schon klar. Du kannst ein X nicht in ein X konvertieren. WTF??</p>
<p>(ideone übersetzt problemlos)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2209974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209974</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 09 May 2012 17:55:45 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Wed, 09 May 2012 18:03:57 GMT]]></title><description><![CDATA[<p>MSVC Bug? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p>Btw: Memberfunktionen spezialisieren geht offenbar doch, nur nicht direkt innerhalb der Klasse. <a href="http://ideone.com/q2C94" rel="nofollow">http://ideone.com/q2C94</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2209975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209975</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 09 May 2012 18:03:57 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Wed, 09 May 2012 18:11:22 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;cassert&gt;
#include &lt;type_traits&gt;

struct Dummy {
  static Dummy DUMMYvoid(void) { return Dummy(); }
  static Dummy DUMMYint(int) { return Dummy(); }
  typedef Dummy (*voidCreator)(void);
  typedef Dummy (*intCreator)(int);

  template &lt;voidCreator creator&gt;
  typename std::enable_if&lt;creator == &amp;Dummy::DUMMYvoid, void&gt;::type get() const {}

  template &lt;intCreator creator&gt;
  typename std::enable_if&lt;creator == &amp;Dummy::DUMMYint,int&gt;::type get() const { return 10; }
};

int main()
{
  auto di = Dummy::DUMMYint(10);
  auto i = di.get&lt;&amp;Dummy::DUMMYint&gt;(); //line 46
  assert(i == 10);
}
</code></pre>
<p>compiliert.</p>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>Btw: Memberfunktionen spezialisieren geht offenbar doch, nur nicht direkt innerhalb der Klasse. <a href="http://ideone.com/q2C94" rel="nofollow">http://ideone.com/q2C94</a></p>
</blockquote>
<p>Das ist glaube ich ein GCC bug.</p>
<p>EDIT: Alternative oben verbessert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2209976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209976</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 09 May 2012 18:11:22 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Wed, 09 May 2012 18:09:31 GMT]]></title><description><![CDATA[<p>pyhax schrieb:</p>
<blockquote>
<p>Das ist glaube ich ein GCC bug.</p>
</blockquote>
<p>Kann mir nicht vorstellen, dass GCC so fundamentale Bugs hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2209978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209978</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 09 May 2012 18:09:31 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Wed, 09 May 2012 18:15:28 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>pyhax schrieb:</p>
<blockquote>
<p>Das ist glaube ich ein GCC bug.</p>
</blockquote>
<p>Kann mir nicht vorstellen, dass GCC so fundamentale Bugs hat.</p>
</blockquote>
<p>Kann sein das ich das mit was anderem verwechsele, ich meine ich hätte es mal irgendwo gelesen, finde es jetzt aber auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2209981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209981</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Wed, 09 May 2012 18:15:28 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Wed, 09 May 2012 19:00:02 GMT]]></title><description><![CDATA[<p>pyhax schrieb:</p>
<blockquote>
<p>314159265358979 schrieb:</p>
<blockquote>
<p>pyhax schrieb:</p>
<blockquote>
<p>Das ist glaube ich ein GCC bug.</p>
</blockquote>
<p>Kann mir nicht vorstellen, dass GCC so fundamentale Bugs hat.</p>
</blockquote>
<p>Kann sein das ich das mit was anderem verwechsele, ich meine ich hätte es mal irgendwo gelesen, finde es jetzt aber auch nicht.</p>
</blockquote>
<p>Mit Glauben hat es zum Glück nichts zu tun. Templatespezialisierungen müssen stets in dem umliegenden Namensraum (lies: namespace, nicht scope/deklarative Region!) deklariert werden, in dem sich das Primärtemplate befindet. Für Memberfunktionstemplates also der Namensraum, in dem die jeweilige Klasse definiert wurde.<br />
Weitere Besonderheiten sind im Prinzip nicht zu beachten.</p>
<p>Außer nat. dass explizite Templatedefinitionen keine Templates darstellen, so dass für Membertemplates von Templateklassen immer auch das umliegende Template mit zu spezialisieren ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2209997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2209997</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 09 May 2012 19:00:02 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Wed, 09 May 2012 19:31:57 GMT]]></title><description><![CDATA[<p>pyhax schrieb:</p>
<blockquote>
<pre><code class="language-cpp">[...]
</code></pre>
<p>compiliert.</p>
</blockquote>
<p>Im MSVC2010 nicht:</p>
<pre><code>1&gt;test.cpp(20): error C2446: '==': Keine Konvertierung von 'Dummy::voidCreator' in 'Dummy (__cdecl *)(int)'
1&gt;          Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
1&gt;test.cpp(20): error C2440: '==': 'Dummy::voidCreator' kann nicht in 'Dummy (__cdecl *)(int)' konvertiert werden
1&gt;test.cpp(20): error C2770: Ungültige explizite template-Argumente für &quot;std::enable_if&lt;creator==Dummy Dummy::DUMMYint(int),int&gt;::type Dummy::get(void) const&quot;.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2210003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210003</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 09 May 2012 19:31:57 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Wed, 09 May 2012 22:50:17 GMT]]></title><description><![CDATA[<p>Ok, definitiv buggy:</p>
<pre><code class="language-cpp">struct Dummy {
  static Dummy foo(int);
};

Dummy bar(int);

template &lt;class T&gt; struct P1;

template &lt;class R, class T&gt; 
struct P1&lt;R(*)(T)&gt; { 
  typedef T type;
};

template &lt;class T&gt; 
typename P1&lt;T&gt;::type 
  get(T) { return 1; }

int main()
{
  auto i = get(bar); //line 22
  auto j = get(Dummy::foo); //line 23
}
</code></pre>
<p>[code]2&gt;test.cpp(23): error C2893: Failed to specialize function template 'P1&lt;T&gt;::type get(T)'<br />
2&gt; With the following template arguments:<br />
2&gt; 'Dummy (__cdecl *)(int)'<br />
2&gt;test.cpp(23): fatal error C1903: unable to recover from previous error(s); stopping compilation[/cpp]</p>
<p>bar und Dummy::foo haben den selben Typ, oder nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210043</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 09 May 2012 22:50:17 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Thu, 10 May 2012 13:09:12 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>bar und Dummy::foo haben den selben Typ, oder nicht?</p>
</blockquote>
<p>Nein, haben sie nicht. Dummy::foo ist vom Typ Dummy (Dumyy::<em>)(int). Bar ist vom Typ Dummy(</em>)(int). Oder ist das bei static Funktionen anders?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210176</guid><dc:creator><![CDATA[pyhax]]></dc:creator><pubDate>Thu, 10 May 2012 13:09:12 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Thu, 10 May 2012 13:36:41 GMT]]></title><description><![CDATA[<p>pyhax schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>bar und Dummy::foo haben den selben Typ, oder nicht?</p>
</blockquote>
<p>Dummy::foo ist vom Typ Dummy (Dumyy::*)(int).</p>
</blockquote>
<p>Meinst du <code>::Dummy*</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210192</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 10 May 2012 13:36:41 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionstemplate-Magie - sehe die Überladung nicht. on Thu, 10 May 2012 16:25:24 GMT]]></title><description><![CDATA[<p>pyhax schrieb:</p>
<blockquote>
<p>Oder ist das bei static Funktionen anders?</p>
</blockquote>
<p>Richtig. Static Funktionen sind was das angeht wie freie Funktionen, gleiches gilt für static variablen.</p>
<p>/edit: war nix. warum auch immer der Linker die letzten Stunden nicht angesprungen ist -.-</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210210</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 10 May 2012 16:25:24 GMT</pubDate></item></channel></rss>