<?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[C++ Template operatoren, Literal &amp;quot;auto&amp;quot;cast int nach &amp;lt;double&amp;gt;]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>habe folgendes Problem mit dem folgenden Template und Operator:</p>
<pre><code>template&lt;class T&gt;
class A
{
public:

    T var1;

};

//===============================================
template&lt;class T&gt;
A&lt;T&gt; operator*(A&lt;T&gt; lhs, const T&amp; rhs)
{
    lhs.var1 *= rhs;
    return lhs;
}
</code></pre>
<p>Wenn ich dann in der main ein Objekt von A erstelle ergibt der Aufruf von * mit einem double Literal keinen Fehler, mit einem int Literal schon:</p>
<pre><code>int main(int argc, char** argv)
{
    A&lt;double&gt; a;

    // folgende Zeile ergibt keinen Compilierfehler:
    a = a * 5.0;

    // diese Zeile schon: 
    a = a * 5;
    // Die Fehlermeldung besagt, dass kein entsprechender operator* für diese Operation gefunden wurde.
}
</code></pre>
<p>Meine Frage ist nun, ob ich die Operatoren für int, unsigned int etc. überladen muss oder ob es eine elegante Methode für dieses cast-Problem gibt? Bzw. ob Literale von Standarddatentypen nicht vom Compiler bei Templates automatisch gecastet werden, im Gegensatz zu folgendem Beispiel ohne Template? Und wenn ja, natürlich warum? <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>
<pre><code>int main(int argc, char** argv)
{
    double a;
    a = a * 5;  // wird automatisch als 5.0 vom Compiler interpretiert
    return 0;
}
</code></pre>
<p>Viele Grüße<br />
FrankC++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/313340/c-template-operatoren-literal-quot-auto-quot-cast-int-nach-lt-double-gt</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 03:54:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/313340.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Jan 2013 13:53:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++ Template operatoren, Literal &amp;quot;auto&amp;quot;cast int nach &amp;lt;double&amp;gt; on Mon, 28 Jan 2013 13:53:55 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>habe folgendes Problem mit dem folgenden Template und Operator:</p>
<pre><code>template&lt;class T&gt;
class A
{
public:

    T var1;

};

//===============================================
template&lt;class T&gt;
A&lt;T&gt; operator*(A&lt;T&gt; lhs, const T&amp; rhs)
{
    lhs.var1 *= rhs;
    return lhs;
}
</code></pre>
<p>Wenn ich dann in der main ein Objekt von A erstelle ergibt der Aufruf von * mit einem double Literal keinen Fehler, mit einem int Literal schon:</p>
<pre><code>int main(int argc, char** argv)
{
    A&lt;double&gt; a;

    // folgende Zeile ergibt keinen Compilierfehler:
    a = a * 5.0;

    // diese Zeile schon: 
    a = a * 5;
    // Die Fehlermeldung besagt, dass kein entsprechender operator* für diese Operation gefunden wurde.
}
</code></pre>
<p>Meine Frage ist nun, ob ich die Operatoren für int, unsigned int etc. überladen muss oder ob es eine elegante Methode für dieses cast-Problem gibt? Bzw. ob Literale von Standarddatentypen nicht vom Compiler bei Templates automatisch gecastet werden, im Gegensatz zu folgendem Beispiel ohne Template? Und wenn ja, natürlich warum? <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>
<pre><code>int main(int argc, char** argv)
{
    double a;
    a = a * 5;  // wird automatisch als 5.0 vom Compiler interpretiert
    return 0;
}
</code></pre>
<p>Viele Grüße<br />
FrankC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2294108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2294108</guid><dc:creator><![CDATA[FrankC++]]></dc:creator><pubDate>Mon, 28 Jan 2013 13:53:55 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Template operatoren, Literal &amp;quot;auto&amp;quot;cast int nach &amp;lt;double&amp;gt; on Mon, 28 Jan 2013 14:00:15 GMT]]></title><description><![CDATA[<p>Der Compiler richtet sich in deinem Fall nach dem Typen des Templates von A.<br />
Die Lösung ist simpel:</p>
<pre><code>template &lt;typename T, typename U&gt;
A&lt;T&gt; operator * (A&lt;T&gt; lhs, U rhs)
{
    lhs.var *= static_cast&lt;T&gt;(rhs);
    return lhs;
}
</code></pre>
<p>U muss nach T konvertiert werden können (wie bei int-&gt;double).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2294110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2294110</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 28 Jan 2013 14:00:15 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Template operatoren, Literal &amp;quot;auto&amp;quot;cast int nach &amp;lt;double&amp;gt; on Mon, 28 Jan 2013 14:00:37 GMT]]></title><description><![CDATA[<p>ja das geht:</p>
<pre><code>template&lt;class T, class U&gt;
A&lt;T&gt; operator*(A&lt;T&gt; lhs, const U&amp; rhs)
{
    lhs.var1 *= rhs;
    return lhs;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2294111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2294111</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Mon, 28 Jan 2013 14:00:37 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Template operatoren, Literal &amp;quot;auto&amp;quot;cast int nach &amp;lt;double&amp;gt; on Mon, 28 Jan 2013 14:07:49 GMT]]></title><description><![CDATA[<p>Super, das ist die Lösung!!<br />
Danke euch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2294112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2294112</guid><dc:creator><![CDATA[FrankC++]]></dc:creator><pubDate>Mon, 28 Jan 2013 14:07:49 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Template operatoren, Literal &amp;quot;auto&amp;quot;cast int nach &amp;lt;double&amp;gt; on Mon, 28 Jan 2013 14:52:44 GMT]]></title><description><![CDATA[<p>FrankC++ schrieb:</p>
<blockquote>
<pre><code>template&lt;class T&gt;
class A
{
public:
    T var1;
};

template&lt;class T&gt;
A&lt;T&gt; operator*(A&lt;T&gt; lhs, const T&amp; rhs)
{
    lhs.var1 *= rhs;
    return lhs;
}
</code></pre>
<p>...</p>
<pre><code>int main(int argc, char** argv)
{
    A&lt;double&gt; a;

    // folgende Zeile ergibt keinen Compilierfehler:
    a = a * 5.0;

    // diese Zeile schon: 
    a = a * 5;
    // Die Fehlermeldung besagt, dass kein entsprechender
    // operator* für diese Operation gefunden wurde.
}
</code></pre>
<p>Meine Frage ist nun, ob ich die Operatoren für int, unsigned int etc. überladen muss oder ob es eine elegante Methode für dieses cast-Problem gibt? Bzw. ob Literale von Standarddatentypen nicht vom Compiler bei Templates automatisch gecastet werden, im Gegensatz zu folgendem Beispiel ohne Template? Und wenn ja, natürlich warum? <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>Ich kann dir das Buch &quot;C++ Templates: The Complete Guide&quot; empfehlen. Da stehen echt sehr wissenswerte Sachen über Templates in C++ drin. Deinen Code konntest du nicht kompilieren, weil die &quot;template argument deduction&quot; fehlgeschlagen ist. Der Compiler hat versucht einen entsprechenden Multiplikationsoperator zu finden. Das einzige, was er fand war dein Template. Allerdings müsste er erst herausfinden, was der Typparameter T eigentlich sein soll. Und da ist das Problem. Guckt er sich den ersten Funktionsparameter an, kommt er zu dem Ergebnis T=double. Guckt er sich den zweiten Funktionsparameter an, kommt er zu dem Ergebnis T=int. Diese Ergebnisse widersprechen sich allerdings, weswegen das Template ignoriert wird. Die Zahl der Konvertierungen, die in dieser Phase überhaupt betrachtet werden, sind minimal. Da dann ja nichts an möglichen Operatoren übrig bleibt, gibt es einen Fehler zur Compile-Zeit.</p>
<p>Ich würde dir folgendes empfehlen:</p>
<pre><code>template&lt;class T&gt;
class A
{
public:
    T var1;

    friend A operator*(A a, T b)
    {
        a.var1 *= b;
        return a;
    }
};
</code></pre>
<p>Dieser Operator ist nun kein Template, es muss also auch kein Template-Argument bestimmt werden. Der Operator wird per ADL gefunden.</p>
<p>Alternativ kannst du die Template-Argument-Deduction auch für den zweiten Parameter effektiv abschalten:</p>
<pre><code>template&lt;class T&gt;
struct id {typedef T type;};

template&lt;class T&gt;
A&lt;T&gt; operator*(A&lt;T&gt; a, typename id&lt;T&gt;::type b)
{
  a.var1 *= b;
  return a;
}
</code></pre>
<p>Hier ist id&lt;T&gt;::type kein sogenannter &quot;deduzibler Kontext&quot;, weswegen der Compiler beim zweiten Parameter auch gar nicht erst versucht, zu raten, was T sein könnte. In deinem Fall würde er hier wie gewünscht, T=double herleiden und dann das Funktionstemplate für double instantiieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2294125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2294125</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 28 Jan 2013 14:52:44 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Template operatoren, Literal &amp;quot;auto&amp;quot;cast int nach &amp;lt;double&amp;gt; on Tue, 29 Jan 2013 06:28:00 GMT]]></title><description><![CDATA[<p>In diesem Fall würde ich aber über ein typedef in A gehen, um klar zu machen, was T ist. der id-trick funktioniert zwar gut, aber ich brauche immer einen Ticken länger um ihn zu verstehen. Aber vielleicht bin ich ja nur speziell gefordert :-).</p>
<pre><code>template&lt;class T&gt;
struct A{
    typedef T value_type; //&quot;ich arbeite mit variablen vom Typ T&quot;
    value_type var1;
};

//und nun geben wir dem zweiten Parameter als typ: &quot;muss derselbe typ sein, wie die Variablen mit denen A arbeitet&quot;
template&lt;class T&gt;
A&lt;T&gt; operator*(A&lt;T&gt; a, typename A&lt;T&gt;::value_type b)
{
  a.var1 *= b;
  return a;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2294352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2294352</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 29 Jan 2013 06:28:00 GMT</pubDate></item><item><title><![CDATA[Reply to C++ Template operatoren, Literal &amp;quot;auto&amp;quot;cast int nach &amp;lt;double&amp;gt; on Tue, 29 Jan 2013 08:02:04 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>In diesem Fall würde ich aber über ein typedef in A gehen, um klar zu machen, was T ist.</p>
</blockquote>
<p>Das war klar. Dein typedef macht es schlimmer. Muss mehr lesen, um, ihn zu finden. Ist ungewöhnlicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2294376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2294376</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 29 Jan 2013 08:02:04 GMT</pubDate></item></channel></rss>