<?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[Templates, Funktionsüberladung, Fehler weil falsche Funktion aufgerufen wird]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &lt;cassert&gt;

struct Control
{
	char const* get_value() const
	{
		return &quot;{value of control}&quot;;
	}
};

template&lt;typename ControlT&gt;
void foo(ControlT const&amp; control)
{
	std::cout &lt;&lt; &quot;Ctrl value: &quot; &lt;&lt; control.get_value() &lt;&lt; std::endl;
}

template&lt;typename ControlT&gt;
void foo(ControlT const* control)
{
	std::cout &lt;&lt; &quot;Validate control pointer.&quot; &lt;&lt; std::endl;
	assert(control);

	foo(*control);
}

int main()
{
	Control ctrl;
	Control* p = &amp;ctrl;

	foo(p); // Error, weil foo(ControlT const&amp; control) aufgerufen wird.
	// ControlT gesetzt auf Control*,
	// Statt foo(ControlT const* control) und ControlT gesetzt auf Control.

	return 0;
}
</code></pre>
<p>Wieso ruft der Kompiler nicht die Funktion auf, welche den Zeiger erwartet, vor allem wenn er dann entdeckt, dass es bei der ersten Funktion einen Kompilerfehler gibt.</p>
<p>Wie kann ich den Kompiler dazu bringen, dass er die richtig Funktion verwendet? Was übersehe ich?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/240938/templates-funktionsüberladung-fehler-weil-falsche-funktion-aufgerufen-wird</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 19:59:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/240938.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 May 2009 16:55:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates, Funktionsüberladung, Fehler weil falsche Funktion aufgerufen wird on Wed, 13 May 2009 17:07:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &lt;cassert&gt;

struct Control
{
	char const* get_value() const
	{
		return &quot;{value of control}&quot;;
	}
};

template&lt;typename ControlT&gt;
void foo(ControlT const&amp; control)
{
	std::cout &lt;&lt; &quot;Ctrl value: &quot; &lt;&lt; control.get_value() &lt;&lt; std::endl;
}

template&lt;typename ControlT&gt;
void foo(ControlT const* control)
{
	std::cout &lt;&lt; &quot;Validate control pointer.&quot; &lt;&lt; std::endl;
	assert(control);

	foo(*control);
}

int main()
{
	Control ctrl;
	Control* p = &amp;ctrl;

	foo(p); // Error, weil foo(ControlT const&amp; control) aufgerufen wird.
	// ControlT gesetzt auf Control*,
	// Statt foo(ControlT const* control) und ControlT gesetzt auf Control.

	return 0;
}
</code></pre>
<p>Wieso ruft der Kompiler nicht die Funktion auf, welche den Zeiger erwartet, vor allem wenn er dann entdeckt, dass es bei der ersten Funktion einen Kompilerfehler gibt.</p>
<p>Wie kann ich den Kompiler dazu bringen, dass er die richtig Funktion verwendet? Was übersehe ich?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1710075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710075</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 13 May 2009 17:07:12 GMT</pubDate></item><item><title><![CDATA[Reply to Templates, Funktionsüberladung, Fehler weil falsche Funktion aufgerufen wird on Wed, 13 May 2009 17:45:21 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">foo(static_cast&lt;Control const*&gt;(p)); 
//anstatt
foo(p);
</code></pre>
<p>Hatte das Problem auch schon mal. Keine Ahnung, wieso die Compiler das bei <code>const &amp;</code> und <code>const *</code> so komisch auflösen.<br />
Alternativ kannste auch die constness bei der Pointer-Version wegmachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1710094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710094</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 13 May 2009 17:45:21 GMT</pubDate></item><item><title><![CDATA[Reply to Templates, Funktionsüberladung, Fehler weil falsche Funktion aufgerufen wird on Wed, 13 May 2009 17:52:37 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">foo(static_cast&lt;Control const*&gt;(p)); 
//anstatt
foo(p);
</code></pre>
</blockquote>
<p>Dann aber lieber gleich:</p>
<pre><code class="language-cpp">foo&lt;Control&gt;(p);
</code></pre>
<p>Aber ich möchte ja eigentlich, dass der Kompiler das selber erkennt und ich es nicht mehr extra hinschreiben muss <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>
<p>Tachyon schrieb:</p>
<blockquote>
<p>Alternativ kannste auch die constness bei der Pointer-Version wegmachen.</p>
</blockquote>
<p>Nein, kann ich nicht. Es gibt auch Zeiger, welche auf konstante Objekte zeigen. Die sollen auch übergeben werden können <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>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1710098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710098</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 13 May 2009 17:52:37 GMT</pubDate></item><item><title><![CDATA[Reply to Templates, Funktionsüberladung, Fehler weil falsche Funktion aufgerufen wird on Wed, 13 May 2009 18:02:15 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Wieso ruft der Kompiler nicht die Funktion auf, welche den Zeiger erwartet, vor allem wenn er dann entdeckt, dass es bei der ersten Funktion einen Kompilerfehler gibt.</p>
</blockquote>
<p>Es gibt SFINAE, aber nicht CFINAE <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>
<p>Dravere schrieb:</p>
<blockquote>
<p>Wie kann ich den Kompiler dazu bringen, dass er die richtig Funktion verwendet?</p>
</blockquote>
<pre><code class="language-cpp">template &lt;typename T&gt;
  struct RemovePointer
{ typedef T type; };
template &lt;typename T&gt;
  struct RemovePointer &lt;T*&gt;
{ typedef T type; };

template &lt;typename ControlT&gt;
  void fooDecorator (const ControlT&amp; control)
{ foo &lt;typename RemovePointer &lt;ControlT&gt;::type&gt; (control); }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1710105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710105</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Wed, 13 May 2009 18:02:15 GMT</pubDate></item><item><title><![CDATA[Reply to Templates, Funktionsüberladung, Fehler weil falsche Funktion aufgerufen wird on Wed, 13 May 2009 18:19:04 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8276">@audacia</a>,<br />
CFINAE? Was meinst du mit dem C? <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>Zu deiner Lösung:<br />
Naja, aber da kann ich den zusätzlichen Code bei Zeigern gleich vergessen. Dann wäre diese Lösung noch besser:</p>
<pre><code class="language-cpp">#include &lt;boost/type_traits/is_pointer.hpp&gt;

#include &lt;iostream&gt;

#include &lt;cassert&gt;

template&lt;int&gt;
struct Int2Type { };

template&lt;bool SELECT_IF, typename IfT, typename ElseT&gt;
struct Select
{
	typedef IfT Type;
};

template&lt;typename IfT, typename ElseT&gt;
struct Select&lt;false, IfT, ElseT&gt;
{
	typedef ElseT Type;
};

template&lt;typename ControlT&gt;
void foo_helper(ControlT const&amp; control, Int2Type&lt;true&gt;)
{
	std::cout &lt;&lt; &quot;Ctrl value: &quot; &lt;&lt; control.get_value() &lt;&lt; std::endl;
}

template&lt;typename ControlT&gt;
void foo_helper(ControlT const* control, Int2Type&lt;false&gt;)
{
	std::cout &lt;&lt; &quot;Validate control pointer.&quot; &lt;&lt; std::endl;
	assert(control);

	foo_helper(*control, Int2Type&lt;true&gt;());
}

template&lt;typename ControlT&gt;
void foo(ControlT const&amp; control)
{
	foo_helper(
		control,
		Select
		&lt;
			boost::is_pointer&lt;ControlT&gt;::value,
			Int2Type&lt;false&gt;,
			Int2Type&lt;true&gt;
		&gt;::Type());
};

struct Control
{
	char const* get_value() const
	{
		return &quot;{value of control}&quot;;
	}
};

int main()
{
	Control ctrl;
	Control* p = &amp;ctrl;

	foo(p);

	return 0;
}
</code></pre>
<p>Grüssli <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/1710116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710116</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 13 May 2009 18:19:04 GMT</pubDate></item><item><title><![CDATA[Reply to Templates, Funktionsüberladung, Fehler weil falsche Funktion aufgerufen wird on Wed, 13 May 2009 18:56:01 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8276">@audacia</a>,<br />
CFINAE? Was meinst du mit dem C? <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>
</blockquote>
<p>Compilation.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Zu deiner Lösung:<br />
Naja, aber da kann ich den zusätzlichen Code bei Zeigern gleich vergessen.</p>
</blockquote>
<p>?<br />
Was tut mein Code denn nicht, was du erwartest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1710128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710128</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Wed, 13 May 2009 18:56:01 GMT</pubDate></item><item><title><![CDATA[Reply to Templates, Funktionsüberladung, Fehler weil falsche Funktion aufgerufen wird on Wed, 13 May 2009 19:25:59 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8276">@audacia</a>,<br />
CFINAE? Was meinst du mit dem C? <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>
</blockquote>
<p>Compilation.</p>
</blockquote>
<p>Wieso hat das was mit Compilation und nicht mit Substitution zu tun? Ein Zeiger kann nicht per . (dot) verwendet werden. Das sollte doch auch bei der Substitution erkannt werden. Zudem, wieso wird die Funktion mit der Referenz gewählt, statt der Funktion mit dem Zeiger?</p>
<p>audacia schrieb:</p>
<blockquote>
<p>Was tut mein Code denn nicht, was du erwartest?</p>
</blockquote>
<p>Mein Code hat bei einem Zeiger ein <code>assert</code> und ein <code>std::cout &lt;&lt; &quot;Validate control pointer.&quot; &lt;&lt; std::endl;</code> drin. Probier sowas bei deinem Code zu implementieren und zwar nur für Zeiger <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>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1710135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710135</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 13 May 2009 19:25:59 GMT</pubDate></item><item><title><![CDATA[Reply to Templates, Funktionsüberladung, Fehler weil falsche Funktion aufgerufen wird on Wed, 13 May 2009 20:42:47 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>audacia schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8276">@audacia</a>,<br />
CFINAE? Was meinst du mit dem C? <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>
</blockquote>
<p>Compilation.</p>
</blockquote>
<p>Wieso hat das was mit Compilation und nicht mit Substitution zu tun?</p>
</blockquote>
<p>SFINAE betrifft nur die Überladungsauflösung, mithin die Funktionssignaturen und nicht die Implementation. Und wenn der Compiler ein Template instantiiert, muß er nicht nur Typen substituieren, sondern auch den Code compilieren <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>
<p>Dravere schrieb:</p>
<blockquote>
<p>Zudem, wieso wird die Funktion mit der Referenz gewählt, statt der Funktion mit dem Zeiger?</p>
</blockquote>
<p>Wüßte ich es, hätte ich oben geantwortet. Offenbar sieht der Standard diese Reihenfolge vor. Wir müssen dann eben damit leben.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Mein Code hat bei einem Zeiger ein <code>assert</code> und ein <code>std::cout &lt;&lt; &quot;Validate control pointer.&quot; &lt;&lt; std::endl;</code> drin. Probier sowas bei deinem Code zu implementieren und zwar nur für Zeiger <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>
</blockquote>
<p>Habe ich doch. Hast du ihn denn überhaupt ausprobiert?</p>
<pre><code class="language-cpp">int main (void)
{
    Control ctrl;
    Control* p = &amp;ctrl;

    fooDecorator (p);
    fooDecorator (ctrl);
}
</code></pre>
<pre><code>Validate control pointer.
Ctrl value: {value of control}
Ctrl value: {value of control}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1710168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710168</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Wed, 13 May 2009 20:42:47 GMT</pubDate></item><item><title><![CDATA[Reply to Templates, Funktionsüberladung, Fehler weil falsche Funktion aufgerufen wird on Wed, 13 May 2009 22:28:31 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Habe ich doch. Hast du ihn denn überhaupt ausprobiert?</p>
</blockquote>
<p>Es ist noch schlimmer, ich habe nicht richtig hingeschaut, denn wenn ich es getan hätte, hätte ich gesehen, dass der Code funktioniert, wie gewünscht. Dazu muss man nicht mal ausprobieren <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>
<p>*muss zum Augenarzt* ... *und das sogar tatsächlich* <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="🙂"
    /><br />
Naja, danke für die Hilfe. Ich denke, dass ich es schlussendlich auf die einfache Art lösen werde. Nur die Zeigerversion nehmen, denn 99% der Controls sind Zeiger.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1710204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1710204</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 13 May 2009 22:28:31 GMT</pubDate></item></channel></rss>