<?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[Typumwandlung bei Template-Argumente]]></title><description><![CDATA[<p>Hallo,<br />
da gibts etwas was ich noch nie so richtig gerrafft habe.<br />
[Effektiv C++, 3. Auflage, Tipp: 47]</p>
<p>Es geht um folgendes.</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class Rational {

  public:
          Rational(const T&amp; numerator = 0,const T&amp; denominator = 1);
};

template&lt;class T&gt;
const Rational&lt;T&gt; operator*(const const Rational&lt;T&gt;&amp; lhs,const Rational&lt;T&gt;&amp; rhs)
{ ... }
</code></pre>
<p>Nun führ dieser Auruf zu einem Fehler:</p>
<pre><code class="language-cpp">Rational&lt;int&gt; sinn(1,2);
Rational&lt;int&gt; res = sinn * 2; // Fehler
</code></pre>
<p>Bei einer NichtTemplate Klasse wäre das OK, weil die 2 implizit durch den nicht expliciten C'tor in ein Rational Objekt umgewandelt werden könnte.</p>
<p>Doch bei Templates funktioniert das nicht, denn Zitat: &quot;Impliziete Typumwandlungsfunktion werden nie zur Herleitung von Template-Argumenten herangezogen&quot;.</p>
<p>Wieso ist das so, wieso erzeugt der Compiler wenn er die 2 sieht nicht einen Rational&lt;int&gt;, er muss sie ja sogar nicht erzeugen, weil er ja durch sinn schon eins hat.</p>
<p>Die Erklärung habe ich nicht ganz verstanden.<br />
Frage : Kann mir das einer erklären <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>Der Rest ist mir dann klar, wie das dann mit friend abläuft. Nur das obere nicht, womit ich die Lücke zw. Problem und Lösung nicht schließen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/161613/typumwandlung-bei-template-argumente</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 23:42:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/161613.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 08 Oct 2006 17:33:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Typumwandlung bei Template-Argumente on Sun, 08 Oct 2006 19:05:46 GMT]]></title><description><![CDATA[<p>Hallo,<br />
da gibts etwas was ich noch nie so richtig gerrafft habe.<br />
[Effektiv C++, 3. Auflage, Tipp: 47]</p>
<p>Es geht um folgendes.</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class Rational {

  public:
          Rational(const T&amp; numerator = 0,const T&amp; denominator = 1);
};

template&lt;class T&gt;
const Rational&lt;T&gt; operator*(const const Rational&lt;T&gt;&amp; lhs,const Rational&lt;T&gt;&amp; rhs)
{ ... }
</code></pre>
<p>Nun führ dieser Auruf zu einem Fehler:</p>
<pre><code class="language-cpp">Rational&lt;int&gt; sinn(1,2);
Rational&lt;int&gt; res = sinn * 2; // Fehler
</code></pre>
<p>Bei einer NichtTemplate Klasse wäre das OK, weil die 2 implizit durch den nicht expliciten C'tor in ein Rational Objekt umgewandelt werden könnte.</p>
<p>Doch bei Templates funktioniert das nicht, denn Zitat: &quot;Impliziete Typumwandlungsfunktion werden nie zur Herleitung von Template-Argumenten herangezogen&quot;.</p>
<p>Wieso ist das so, wieso erzeugt der Compiler wenn er die 2 sieht nicht einen Rational&lt;int&gt;, er muss sie ja sogar nicht erzeugen, weil er ja durch sinn schon eins hat.</p>
<p>Die Erklärung habe ich nicht ganz verstanden.<br />
Frage : Kann mir das einer erklären <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>Der Rest ist mir dann klar, wie das dann mit friend abläuft. Nur das obere nicht, womit ich die Lücke zw. Problem und Lösung nicht schließen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1151567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1151567</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 08 Oct 2006 19:05:46 GMT</pubDate></item><item><title><![CDATA[Reply to Typumwandlung bei Template-Argumente on Mon, 09 Oct 2006 19:55:15 GMT]]></title><description><![CDATA[<blockquote>
<p>Doch bei Templates funktioniert das nicht, denn Zitat: &quot;Impliziete Typumwandlungsfunktion werden nie zur Herleitung von Template-Argumenten herangezogen&quot;.</p>
</blockquote>
<p>Das Ganze hat nicht speziell etwas mit Typumwandlungsfunktionen zu tun. Vielmehr liegt das an den allgemeinen Deduktionsregeln.</p>
<p>Bei der Herleitung von Template-Parametern wird für jedes Argument-Parameter-Paar eine passende *Substitution* gesucht. Also: &quot;mit welchem Typ muss ich den Template-Parameter ersetzen, damit er auf das Argument passt&quot;.<br />
Dabei wird immer ein &quot;exact match&quot; gesucht bzw. sind nur wenige Konvertierungen erlaubt.</p>
<p>Grundsätzlich muss man zwischen Referenz- und &quot;normalen&quot;-Parametern unterscheiden: falls der Parameter eine Referenz ist, dann wird nur der Typ des Arguments berücksichtig. Die einzig erlaubten Konvertierungen sind zuätzliche const/volatile Qualifaktionen sowie derived-to-base-Konvertierungen.<br />
Bsp:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void f(const T&amp; a, const T&amp; b);

int main() {
  f(&quot;Hallo&quot;, &quot;Welt&quot;); // error
}
</code></pre>
<p>Der Typ von a ist const char[6]. Der von b const char[5]. T kann aber nicht beides sein -&gt; Error.</p>
<p>Andernfalls findet ein &quot;decaying&quot; von Array und Funktionen zu Pointern statt. Außerdem werden top-level const/volatile-Qualifikationen ignoriert.<br />
Andere Konvertierungen, wie z.B. benutzer-definierte, sind grundsätzlich nicht erlaubt.</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void f(T a, T b);

int main() {
  f(&quot;Hallo&quot;, &quot;Welt&quot;); // OK. T = char*
}
</code></pre>
<p>Am Ende müssen alle Substitutionen eindeutig sein, andernfalls schlägt die Herleitung fehl.</p>
<p>In deinem Beispiel würde T für den ersten Parameter als int hergeleitet. Für den zweiten gibt es keine Herleitung. Damit ist ingesamt keine Herleitung möglich.<br />
Würde man benutzer-definierte Konvertierungen zulassen, dann hättest du in deinem Fall eine eigenartige Situation: du hast einen Template-Parameter, der einmal mit int und einmal mit &quot;Konvertierung von int nach Rational&lt;int&gt;&quot; substituiert wird - ein schizophrenes T.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1151807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1151807</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Mon, 09 Oct 2006 19:55:15 GMT</pubDate></item><item><title><![CDATA[Reply to Typumwandlung bei Template-Argumente on Tue, 10 Oct 2006 11:57:50 GMT]]></title><description><![CDATA[<p>OK <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="🙂"
    /> Vielen Dank für die Erklärung ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1152175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1152175</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 10 Oct 2006 11:57:50 GMT</pubDate></item></channel></rss>