<?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[Template-Methode mit Default-Parameter]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe eine template-Methode erstellt, die einen Default-Parameter verwendet. Durch den Aufruf der Methode zerstöre ich mir den Stack! Allerdings ist mit nicht klar, was hier falsch ist.</p>
<p>Minimalbeispiel:</p>
<pre><code class="language-cpp">class ForceBug
{
public:
template&lt;typename NumericType&gt;
void bar(NumericType value, NumericType step = NumericType());
};

template&lt;typename NumericType&gt;
void ForceBug::bar(NumericType value, NumericType step)
{
	NumericType dummy = step; // Beim 5. Aufruf von foo.bar ist step != 0.0 
}
int main()
{
	ForceBug foo;
	foo.bar(2);
	foo.bar(2.0);
	foo.bar(2.0);
	foo.bar(2.0);
	foo.bar(2.0); 
	return 0;   // hier kommt vom Debugger die Fehlermeldung:
}
</code></pre>
<p>Fehler:</p>
<pre><code>Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
</code></pre>
<p>Noch ein paar Anmerkungen:<br />
Wenn man den Defaultparamter mit &quot;step=0&quot; definiert, reicht schon ein Aufruf mit einem double-Parameter, um den Fehler zu produzieren. Mit &quot;step=NumericType()&quot; konnte ich es nur reproduzieren, wenn zuerst ein Aufruf mit einem int-Parameter und danach mit einem double-Parameter erfolgt. Der Fehler lässt sich auch nicht bei freien Funktion reproduzieren oder wenn die Methode direkt in der Klasse definiert wird. Ich verwende Visual Studio 2005.</p>
<p>Was mache ich falsch? Falls das ein Compiler-Problem ist, gibt es dazu irgenwo schon einen Fehlerreport? Kann jemand nachvollziehen, ob das Problem in Visual Studio 2008 auch noch besteht?</p>
<p>Danke<br />
djohn</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/281926/template-methode-mit-default-parameter</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 10:34:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/281926.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 Feb 2011 14:31:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 14:31:53 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich habe eine template-Methode erstellt, die einen Default-Parameter verwendet. Durch den Aufruf der Methode zerstöre ich mir den Stack! Allerdings ist mit nicht klar, was hier falsch ist.</p>
<p>Minimalbeispiel:</p>
<pre><code class="language-cpp">class ForceBug
{
public:
template&lt;typename NumericType&gt;
void bar(NumericType value, NumericType step = NumericType());
};

template&lt;typename NumericType&gt;
void ForceBug::bar(NumericType value, NumericType step)
{
	NumericType dummy = step; // Beim 5. Aufruf von foo.bar ist step != 0.0 
}
int main()
{
	ForceBug foo;
	foo.bar(2);
	foo.bar(2.0);
	foo.bar(2.0);
	foo.bar(2.0);
	foo.bar(2.0); 
	return 0;   // hier kommt vom Debugger die Fehlermeldung:
}
</code></pre>
<p>Fehler:</p>
<pre><code>Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
</code></pre>
<p>Noch ein paar Anmerkungen:<br />
Wenn man den Defaultparamter mit &quot;step=0&quot; definiert, reicht schon ein Aufruf mit einem double-Parameter, um den Fehler zu produzieren. Mit &quot;step=NumericType()&quot; konnte ich es nur reproduzieren, wenn zuerst ein Aufruf mit einem int-Parameter und danach mit einem double-Parameter erfolgt. Der Fehler lässt sich auch nicht bei freien Funktion reproduzieren oder wenn die Methode direkt in der Klasse definiert wird. Ich verwende Visual Studio 2005.</p>
<p>Was mache ich falsch? Falls das ein Compiler-Problem ist, gibt es dazu irgenwo schon einen Fehlerreport? Kann jemand nachvollziehen, ob das Problem in Visual Studio 2008 auch noch besteht?</p>
<p>Danke<br />
djohn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019182</guid><dc:creator><![CDATA[djohn@work]]></dc:creator><pubDate>Thu, 10 Feb 2011 14:31:53 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 14:41:58 GMT]]></title><description><![CDATA[<p>Das scheint ein Compiler Bug zu sein, denn du machst rein gar nichts, womit du eine Calling Convention missachten könntest. <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>Unter VS 2010 läuft das ohne Probleme.<br />
VS 2005 hat afaik Probleme mit templates. Kann gut sein, dass es daher kommt, aber mit normalem Code kann man so einen Fehler nicht erzeugen (müsstest z.B inline assembler benutzen oder vlt. mit einem merkwürdigen Pointer hack).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019188</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 10 Feb 2011 14:41:58 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 14:57:47 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Unter VS 2010 läuft das ohne Probleme.</p>
</blockquote>
<p>Bei mir krachts in der 10er EE im Debug. Release läuft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019195</guid><dc:creator><![CDATA[fdfdg]]></dc:creator><pubDate>Thu, 10 Feb 2011 14:57:47 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 15:19:42 GMT]]></title><description><![CDATA[<p>Tatsächlich. Auf Debug krieg ich den Fehler auch. Hatte es aus versehen noch auf Release.</p>
<p>Scheint, dass es Probleme gibt sobald man verschiedene Typen übergibt. Da werden aber korrekt 2 verschiedene Funktionen aufgerufen. Der Fehler scheint von den verschiedenen Grössen der Parameter zu kommen. Aber ich sehe nicht, was an dem Code falsch sein sollte.</p>
<p>Wenn ich x64 Code generieren lasse, dann läufts auch im Debug.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019202</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 10 Feb 2011 15:19:42 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 15:21:24 GMT]]></title><description><![CDATA[<p>Ja, das Minimalbeispiel macht im Release nichts sichtbares, deshalb scheint alles in Ordnung. Wenn man aber einfach eine Ausgabe einfügt, sieht man, dass da was nicht stimmen kann:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
class ForceBug
{
public:
template&lt;typename NumericType&gt;
void bar(NumericType value, NumericType step = NumericType());
};

template&lt;typename NumericType&gt;
void ForceBug::bar(NumericType value, NumericType step)
{
	NumericType dummy = step;
	std::cout &lt;&lt; &quot;Value: &quot; &lt;&lt; value &lt;&lt; &quot; Step: &quot; &lt;&lt; step &lt;&lt; std::endl;
}
int main()
{
	ForceBug foo;
	foo.bar(2);
	foo.bar(2.0);
	foo.bar(2.0);
	foo.bar(2.0);
	foo.bar(2.0);
	return 0;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>Value: 2 Step: 0
Value: 0 Step: 1.80244e-307
Value: 0 Step: 1.79435e-307
Value: 0 Step: 5.30499e-315
Value: 0 Step: 1.23606e-312
</code></pre>
<p>erwartete Ausgabe:</p>
<pre><code>Value: 2 Step: 0
Value: 2 Step: 0
Value: 2 Step: 0
Value: 2 Step: 0
Value: 2 Step: 0
</code></pre>
<p>djohn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019203</guid><dc:creator><![CDATA[djohn@work]]></dc:creator><pubDate>Thu, 10 Feb 2011 15:21:24 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 15:24:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">foo.bar(2.0);
</code></pre>
<p>Kann es sein, dass du</p>
<pre><code class="language-cpp">foo.bar(2,0);
</code></pre>
<p>schreiben wolltest? Denn du erwartest ja 2 Parameter...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019205</guid><dc:creator><![CDATA[vermutung]]></dc:creator><pubDate>Thu, 10 Feb 2011 15:24:12 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 15:34:46 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3891">@djohn</a><br />
Das kommt wahrscheinlich daher, dass bei double irgendwas schief läuft und er irgendwie nicht 2 Wörter liest, sondern so nur ein Teil und dann den Rest von irgend einem anderen Wort liest.</p>
<p>@vermutung<br />
Spielt eigentlich keine Rolle, weil das template 2 Funktionen machen kann. Man kann natürlich beide Parameter angeben, aber das tut ja nichts zur Sache, dass der gezeigte Code einen Fehler generiert.</p>
<p>Ich würde mal vermute, dass hier tatsächlich ein Bug vorliegt. Jemand hier, der GCC installiert hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019208</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 10 Feb 2011 15:34:46 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 15:35:44 GMT]]></title><description><![CDATA[<p>2.0 ist schon richtig, damit soll eine Template-Instance für doube erzwungen werden. (Kann auch jeder andere double-Wert sein.) Als zweiter Parameter soll automatisch der Default-Parameter genommen werden.</p>
<p>djohn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019209</guid><dc:creator><![CDATA[djohn@work]]></dc:creator><pubDate>Thu, 10 Feb 2011 15:35:44 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 15:36:23 GMT]]></title><description><![CDATA[<p>Wirklich merkwürdig, bei mir (VS 2010) ist der Fehler ebenfalls reproduzierbar. Ich würde im Microsoft-spezifischen Unterforum nachfragen (oder diesen Thread verschieben), eventuell wissen die dort mehr.</p>
<p>@ vermutung: Kaum, er will halt mit <code>double</code> instanziieren. Der zweite Parameter ist eh ein Default-Parameter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019210</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 10 Feb 2011 15:36:23 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 15:39:56 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Ich würde mal vermute, dass hier tatsächlich ein Bug vorliegt. Jemand hier, der GCC installiert hat?</p>
</blockquote>
<p>gcc 4.5.2 verhält sich wie erwartet:</p>
<pre><code>$ ./a.out
Value: 2 Step: 0
Value: 2 Step: 0
Value: 2 Step: 0
Value: 2 Step: 0
Value: 2 Step: 0
</code></pre>
<p>Ich sehe im Code auch keinen Fehler. Scheint ein VS-Bug zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019211</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 10 Feb 2011 15:39:56 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 15:40:05 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Jemand hier, der GCC installiert hat?</p>
</blockquote>
<p>Mit g++ 4.5.0 kommt die erwartete Ausgabe (kein Laufzeitfehler):</p>
<pre><code>Value: 2 Step: 0
Value: 2 Step: 0
Value: 2 Step: 0
Value: 2 Step: 0
Value: 2 Step: 0
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2019212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019212</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 10 Feb 2011 15:40:05 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 15:41:19 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Ich würde mal vermute, dass hier tatsächlich ein Bug vorliegt. Jemand hier, der GCC installiert hat?</p>
</blockquote>
<p>Ja. Läuft hervorrragend mit GNU und Intel-Compiler (beide ziemlich neu). Debugger meldet auch nichts verdächtiges. Und ich sehe auch keinen Fehler im Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019213</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 10 Feb 2011 15:41:19 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 15:45:11 GMT]]></title><description><![CDATA[<blockquote>
<p>gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)</p>
</blockquote>
<blockquote>
<p>Value: 2 Step: 0<br />
Value: 2 Step: 0<br />
Value: 2 Step: 0<br />
Value: 2 Step: 0<br />
Value: 2 Step: 0</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2019215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019215</guid><dc:creator><![CDATA[lkjjkl]]></dc:creator><pubDate>Thu, 10 Feb 2011 15:45:11 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 15:47:38 GMT]]></title><description><![CDATA[<p>Kannst du mir mal den generierten Assembler Code für die beiden Funktionen und die main geben? (EDIT: Ohne die Ausgaben, wens geht. :))</p>
<pre><code class="language-cpp">ForceBug foo; 
    foo.bar(2);
    foo.bar(2.0);
</code></pre>
<p>in der main reicht schon, um den Fehler zu erzeugen.</p>
<p>Notiz an mich:<br />
Ich muss mal meine Ubuntu Installation brauchbar machen.. <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/2019216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019216</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 10 Feb 2011 15:47:38 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 16:17:11 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Kannst du mir mal den generierten Assembler Code für die beiden Funktionen und die main geben? (EDIT: Ohne die Ausgaben, wens geht. :))</p>
</blockquote>
<p>Meinst du mich? Ok, hier der Code der unoptimierten Version, weil die optimierte Version total unleserlich ist (GCC 4.4.3, 64 Bit):<br />
main:</p>
<pre><code class="language-asm">leaq	-1(%rbp), %rax
	movl	$0, %edx
	movl	$2, %esi
	movq	%rax, %rdi
	call	_ZN8ForceBug3barIiEEvT_S1_

	movsd	.LC0(%rip), %xmm0
	leaq	-1(%rbp), %rax
	xorpd	%xmm1, %xmm1
	movq	%rax, %rdi
	call	_ZN8ForceBug3barIdEEvT_S1_
</code></pre>
<p>_ZN8ForceBug3barIiEEvT_S1_:</p>
<pre><code class="language-asm">pushq	%rbp
	movq	%rsp, %rbp
	subq	$32, %rsp
	movq	%rdi, -24(%rbp)
	movl	%esi, -28(%rbp)
	movl	%edx, -32(%rbp)
	movl	-32(%rbp), %eax
	movl	%eax, -4(%rbp)
	movl	$.LC2, %esi
	movl	$_ZSt4cout, %edi
	call	_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
	movl	-28(%rbp), %edx
	movl	%edx, %esi
	movq	%rax, %rdi
	call	_ZNSolsEi
	movl	$.LC3, %esi
	movq	%rax, %rdi
	call	_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
	movl	-32(%rbp), %edx
	movl	%edx, %esi
	movq	%rax, %rdi
	call	_ZNSolsEi
	movl	$_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, %esi
	movq	%rax, %rdi
	call	_ZNSolsEPFRSoS_E
	leave
	ret
</code></pre>
<p>Und die andere für double:</p>
<pre><code class="language-asm">pushq	%rbp
	movq	%rsp, %rbp
	subq	$48, %rsp
	movq	%rdi, -24(%rbp)
	movsd	%xmm0, -32(%rbp)
	movsd	%xmm1, -40(%rbp)
	movq	-40(%rbp), %rax
	movq	%rax, -8(%rbp)
	movl	$.LC2, %esi
	movl	$_ZSt4cout, %edi
	call	_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
	movsd	-32(%rbp), %xmm0
	movq	%rax, %rdi
	call	_ZNSolsEd
	movl	$.LC3, %esi
	movq	%rax, %rdi
	call	_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
	movsd	-40(%rbp), %xmm0
	movq	%rax, %rdi
	call	_ZNSolsEd
	movl	$_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, %esi
	movq	%rax, %rdi
	call	_ZNSolsEPFRSoS_E
	leave
	ret
</code></pre>
<p>Debuginformationen habe ich mal rausgekürzt um es übersichtlicher zu halten. Ich weiß jetzt aber nicht, was das bringen soll, beide Funktionen arbeiten korrekt und sind im Prinzip identisch, außer dass bei der einen alle Befehle für int sind, bei der anderen für doubles. Wie sehen die Funktionen denn bei VS 2010 aus?</p>
<p>edit: Oh, die Ausgabefunktionen habe ich entgegen deinem Wunsch noch drin. Naja, so lang ist's ja nun auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019221</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 10 Feb 2011 16:17:11 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 16:45:46 GMT]]></title><description><![CDATA[<p>Hmm. Mir scheint als hätte ich den Fehler gefunden, den VC da macht.<br />
Die Funktionen selbst sind denke ich korrekt implementiert, aber der Aufruf der Funktionen scheint nicht so ganz zu klappen.</p>
<pre><code class="language-asm">foo.bar(2);
00EA10AB  push        0  % zweiter parameter: ok
00EA10AD  push        2  % erster parameter: ok
00EA10AF  lea         ecx,[foo]  % this: ok
00EA10B2  call        ForceBug::bar&lt;int&gt; (0EA1046h)  
    foo.bar(2.0);
00EA10B7  push        0  % (1)
00EA10B9  sub         esp,8  
00EA10BC  fld         qword ptr [__real@4000000000000000 (0EA6830h)]  % parameter 1
00EA10C2  fstp        qword ptr [esp]  % parameter 1 speichern
00EA10C5  lea         ecx,[foo]  % this
00EA10C8  call        ForceBug::bar&lt;double&gt; (0EA103Ch)
</code></pre>
<p>Da sieht man, dass bar(2) korrekt aufgerufen wird. Jedoch bin ich bei (1) stutzig geworden. Warum wird da lediglich ein Wort gepusht und nicht 2, wie es bei einem double ja sein müsste?</p>
<p>Also habe ich das ganze mal umgedreht:</p>
<pre><code class="language-asm">foo.bar(2.0);
00EE10AB  sub         esp,8  
00EE10AE  fldz  % schon eher wenn man floats ausnullen will
00EE10B0  fstp        qword ptr [esp]  
00EE10B3  sub         esp,8  
00EE10B6  fld         qword ptr [__real@4000000000000000 (0EE6830h)]  
00EE10BC  fstp        qword ptr [esp]  
00EE10BF  lea         ecx,[foo]  
00EE10C2  call        ForceBug::bar&lt;double&gt; (0EE103Ch)  
    foo.bar(2);
00EE10C7  sub         esp,8  
00EE10CA  fldz  % (2)
00EE10CC  fstp        qword ptr [esp]  
00EE10CF  push        2  % erster parameter
00EE10D1  lea         ecx,[foo]  
00EE10D4  call        ForceBug::bar&lt;int&gt; (0EE1046h)
</code></pre>
<p>Bei (2) dachte ich dann nur WTF? - Warum wird da eine floating Point Operation gemacht, wenn doch nur int's im Spiel sind?</p>
<p>Da scheint irgendwie Code vorschnell erzeugt zu werden.. Ok, also mal schauen was passiert, wenn wir die bösen templates weglassen. :<br />
(ich habe das template mit identischen Funktionen mit expliziten Parametern ausgetauscht)</p>
<pre><code class="language-asm">foo.bar(2.0);
00C6168B  sub         esp,8  
00C6168E  fldz  
00C61690  fstp        qword ptr [esp]  
00C61693  sub         esp,8  
00C61696  fld         qword ptr [__real@4000000000000000 (0C66830h)]  
00C6169C  fstp        qword ptr [esp]  
00C6169F  lea         ecx,[foo]  
00C616A2  call        ForceBug::bar (0C61050h)  
    foo.bar(2);
00C616A7  push        0  % kein floating Zeugs mehr. 
00C616A9  push        2  
00C616AB  lea         ecx,[foo]  
00C616AE  call        ForceBug::bar (0C6104Bh)
</code></pre>
<p>ahh.. schon eher..</p>
<p>und andersrum:</p>
<pre><code class="language-asm">foo.bar(2);
008A168B  push        0  
008A168D  push        2  
008A168F  lea         ecx,[foo]  
008A1692  call        ForceBug::bar (8A104Bh)  
    foo.bar(2.0);
008A1697  sub         esp,8  
008A169A  fldz  % jetzt passt auch das hier
008A169C  fstp        qword ptr [esp]  
008A169F  sub         esp,8  
008A16A2  fld         qword ptr [__real@4000000000000000 (8A6830h)]  
008A16A8  fstp        qword ptr [esp]  
008A16AB  lea         ecx,[foo]  
008A16AE  call        ForceBug::bar (8A1050h)
</code></pre>
<p>Jetzt stimmts auch in der Richtung.</p>
<p>Fazit: Selbst VC++ 2010 hat gewisse Probleme mit templates.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>:<br />
Danke, aber ich hab den Fehler, den VC da macht bereits. <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>Hat jemand eine Ahnung, ob der Bug bereits gemeldet wurde? Respektive wo es da eine gute DB dazu gibt? Ich werde das bei Gelegenheit mal noch in meinem Blog posten. Wird Zeit, dass da wiedermal was passiert. <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>//EDIT:<br />
Habe anscheinend den korrekten Anlaufpunkt gefunden und der Fehler scheint noch nicht bekannt zu sein:<br />
<a href="https://connect.microsoft.com/VisualStudio/Feedback" rel="nofollow">https://connect.microsoft.com/VisualStudio/Feedback</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019232</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 10 Feb 2011 16:45:46 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Thu, 10 Feb 2011 19:56:22 GMT]]></title><description><![CDATA[<p>scary...</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@drakon</a>: Hast du den Fehler reported?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019333</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 10 Feb 2011 19:56:22 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Fri, 11 Feb 2011 10:07:16 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>vielen Dank für die vielen Rückmeldungen. Ich hab jetzt <a href="https://connect.microsoft.com/VisualStudio/feedback/details/642766/c-bug-when-using-template-member-functions-with-a-default-parameter" rel="nofollow">hier</a><br />
den Fehler gemeldet.</p>
<p>djohn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019508</guid><dc:creator><![CDATA[djohn@work]]></dc:creator><pubDate>Fri, 11 Feb 2011 10:07:16 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Fri, 11 Feb 2011 12:49:38 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>scary...</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@drakon</a>: Hast du den Fehler reported?</p>
</blockquote>
<p>Nein. Bin gester nicht dazu gekommen. Wollte eigentlich einen exakten Beschreib (auch für meinen Blog) von dem Fehler machen.</p>
<p>Ich habe mich gestern dort extra noch angemeldet. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3891">@djohn</a>:<br />
Da ich ja bereits den Fehler analysiert habe wäre es vielleicht gut das auch noch zu melden. Dann können die sich ein wenig Arbeit sparen.. ^^<br />
Ich werde mal in einem Kommentar den Fehlerbeschreib ergänzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019623</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 11 Feb 2011 12:49:38 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Fri, 11 Feb 2011 13:15:08 GMT]]></title><description><![CDATA[<p>Habe gerade noch ein paar Sachen ausprobiert. Mit freien template Funktionen funktioniert es und auch wenn man die Definition inline macht (was denke ich der Hauptgrund ist, dass den Fehler noch niemand bemerkt hat).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019641</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 11 Feb 2011 13:15:08 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Sat, 12 Feb 2011 00:49:33 GMT]]></title><description><![CDATA[<p>Der Bug tritt mit freien Funktionen genau so auf:</p>
<pre><code class="language-cpp">template&lt;typename NumericType&gt; 
void foobar(NumericType value, NumericType step = NumericType());

template&lt;typename NumericType&gt; 
void foobar(NumericType value, NumericType step)
{
    NumericType dummy = step;
	std::cout &lt;&lt; value &lt;&lt; &quot;, &quot; &lt;&lt; step &lt;&lt; std::endl;
}

int main() 
{ 
	foobar(2);
	foobar(3.14);
	return 0;
}

// output:
// 2, 0
// 4.27698e+086, 1.16762e-307
</code></pre>
<p>Scheint aber wirklich davon abhängig zu sein dass Deklaration und Definition getrennt sind. Und ich kann's auch nicht mit etwas anderem als <code>double</code> reproduzieren. Und das auch nur, wenn vorher oder nachher ein Aufruf mit etwas anderem als <code>double</code> erfolgt.</p>
<p>Auch nicht uninteressant folgendes:</p>
<pre><code class="language-cpp">template&lt;typename NumericType&gt; 
void foobar(NumericType value, NumericType step = 2); // &lt;- hier direkt 2 statt NumericType() (0 oder andere Integer gehen genau so)

template&lt;typename NumericType&gt; 
void foobar(NumericType value, NumericType step)
{
    NumericType dummy = step;
	std::cout &lt;&lt; value &lt;&lt; &quot;, &quot; &lt;&lt; step &lt;&lt; std::endl;
}

int main() 
{ 
	foobar(2);
	foobar(3.14);
	return 0;
}

// output:
// 2, 2
// 4.27698e+086, 3.75217e-308
</code></pre>
<p>Immer noch (fast) der selbe falsche Output.</p>
<p>Wenn man als Default-Wert allerdings ein <code>double</code> Literal hinschreibt...</p>
<pre><code class="language-cpp">template&lt;typename NumericType&gt; 
void foobar(NumericType value, NumericType step = 2.71828); // &lt;- jetzt mit double literal hier

template&lt;typename NumericType&gt; 
void foobar(NumericType value, NumericType step)
{
    NumericType dummy = step;
	std::cout &lt;&lt; value &lt;&lt; &quot;, &quot; &lt;&lt; step &lt;&lt; std::endl;
}

int main() 
{ 
	foobar(2);
	foobar(3.14);
	return 0;
}

// output:
// 2, 1949120276
// 3.14, 2.71828
</code></pre>
<p>Auch falsch, aber ganz anders falsch <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/2019933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019933</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 12 Feb 2011 00:49:33 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Sat, 12 Feb 2011 01:51:44 GMT]]></title><description><![CDATA[<p>Der 64 Bit Compiler scheint übrigens genau so betroffen zu sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019949</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 12 Feb 2011 01:51:44 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Sat, 12 Feb 2011 10:52:06 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Der Bug tritt mit freien Funktionen genau so auf:</p>
</blockquote>
<p>Ah. Ich habe das nur mit direkt definierten freien Funktionen probiert.</p>
<blockquote>
<p>Der 64 Bit Compiler scheint übrigens genau so betroffen zu sein</p>
</blockquote>
<pre><code class="language-asm">f.bar(2);
000000013F39165B  xorpd       xmm2,xmm2  
000000013F39165F  mov         edx,2
</code></pre>
<p>Uh, oh. Ja.. sieht so aus.. ^^<br />
Aber es gibt keinen Laufzeitfehler bei mir.</p>
<p>Scheint wirklich hauptsächlich an der Trennung zu liegen. Zum Glück implementieren die meisten templates direkt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019998</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 12 Feb 2011 10:52:06 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Sat, 12 Feb 2011 23:01:13 GMT]]></title><description><![CDATA[<p>Tjaaah... die meisten.</p>
<p>In einem grösseren Projekt das ich gerade entwickle (mit VC 2005) hab' ich *einige* Templates mit getrennter Deklaration und Definition. Zwecks übersichtlichkeit der Header Files (Definition steht in eigenen .inl Files).<br />
Und auch mit Default-Parametern und die Variablen sind auch oft vom Typ <code>double</code> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>EDIT:<br />
Wobei... dort werden eigentlich nur doubles verwendet, und nie was anderes. Sollte dann OK sein. Hab auch noch keinen derartigen Fehler beobachtet. Doof ist es trotzdem. /EDIT</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2020332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2020332</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 12 Feb 2011 23:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Sun, 13 Feb 2011 08:33:08 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a></p>
<p>Beim Versuch ein Minimalbeispiel zu erstellen, konnte ich den Fehler bei freien Funktionen auch nicht reproduzieren. Hatte da wahrscheinlich wie drakon noch eine der anderen Bedingungen wegreduziert. Bei Deiner zweiten Variante (Default-Wert ist ein int) reicht es aus, nur eine Template-Instanz mit double zu erzeugen um zumindest bei VS2005 den Fehler zu provozieren. Die zusätzliche Bedingung, dass man mindestens 2 Template-Instanzen mit unterschiedlichen Typen für den Fehler braucht, fällt dann weg.</p>
<p>Ich hatte auch nur wegen der Übersichtlichkeit Deklaration und Definition getrennt, kein großes Problem, dass jetzt zu ändern. Aber wenn so ein Fehler erstmal auftritt, ist man natürlich unsicher, unter welchen Bedingungnen noch dieses undefinierte Verhalten auftreten kann.<br />
Deshalb, nochmal Danke an alle die sich an der Diskussion beteiligt haben, ich denke, wir haben jetzt ganz gut eingegrenzt, wann der Fehler auftritt.</p>
<p>djohn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2020370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2020370</guid><dc:creator><![CDATA[DJohn]]></dc:creator><pubDate>Sun, 13 Feb 2011 08:33:08 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Methode mit Default-Parameter on Sun, 13 Feb 2011 09:39:36 GMT]]></title><description><![CDATA[<p>Noch was lustiges...<br />
Folgendes compiliert mit VS 2010:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int g_i = 42;

template&lt;typename T&gt; 
void baz(T a1, T* a2 = &amp;g_i); // &lt;- default argument should only work for T = int

template&lt;typename T&gt; 
void baz(T a1, T* a2)
{
	std::cout &lt;&lt; a1 &lt;&lt; &quot;, &quot; &lt;&lt; *a2 &lt;&lt; std::endl;
}

class c {};

std::ostream&amp; operator &lt;&lt; (std::ostream&amp; os, c const&amp;)
{
	return os;
}

int main() 
{
	baz(2);
	baz(3.14);   // compiles OK, but should not
	baz(&quot;test&quot;); // compiles OK, but should not
	baz(c());    // compiles OK, but should not
	return 0;
}
</code></pre>
<p>Beim Ausführen kommt natürlich nur Mist raus...</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2020381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2020381</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 13 Feb 2011 09:39:36 GMT</pubDate></item></channel></rss>