<?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[Buchempfehlung C++ templates + Vererbung]]></title><description><![CDATA[<p>Wer kann mir ein Buch empfehlen was auf typische Probleme im Zusammenhang template BasisKlasse und Vererbung behandelt.</p>
<p>Hab eine Basisklasse die arithmetische op definiert.</p>
<p>z.B. op+=( const Vector&lt;U&gt;&amp; src) und op+=( const U&amp; zahl)<br />
in der abgeleiteten Klasse kann der Compiler die Typen nicht richtig auflösen.<br />
Er ruft dann op+=( const U&amp; zahl) mit U = NumericVector&lt;float&gt; auf.</p>
<p>Wenn ich in der abgeleiteten Klasse alle op nochmal definiere ist wieder alles schön.</p>
<p>Sollte man grundsätzlich auf eins von beidem verzichten oder geht da was quer in meinem Kopf??? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/135596/buchempfehlung-c-templates-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 07:51:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/135596.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 03 Feb 2006 09:32:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Buchempfehlung C++ templates + Vererbung on Fri, 03 Feb 2006 09:32:53 GMT]]></title><description><![CDATA[<p>Wer kann mir ein Buch empfehlen was auf typische Probleme im Zusammenhang template BasisKlasse und Vererbung behandelt.</p>
<p>Hab eine Basisklasse die arithmetische op definiert.</p>
<p>z.B. op+=( const Vector&lt;U&gt;&amp; src) und op+=( const U&amp; zahl)<br />
in der abgeleiteten Klasse kann der Compiler die Typen nicht richtig auflösen.<br />
Er ruft dann op+=( const U&amp; zahl) mit U = NumericVector&lt;float&gt; auf.</p>
<p>Wenn ich in der abgeleiteten Klasse alle op nochmal definiere ist wieder alles schön.</p>
<p>Sollte man grundsätzlich auf eins von beidem verzichten oder geht da was quer in meinem Kopf??? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/984789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/984789</guid><dc:creator><![CDATA[cris492]]></dc:creator><pubDate>Fri, 03 Feb 2006 09:32:53 GMT</pubDate></item><item><title><![CDATA[Reply to Buchempfehlung C++ templates + Vererbung on Mon, 06 Feb 2006 18:56:07 GMT]]></title><description><![CDATA[<p>Hallo da draußen, es wäre echt toll wenn jemand was sagen könnte.</p>
<p>Und fallst Du denkst, schau doch erstmal bei den Buchempfehlungen nach, glaub mir ich hab es getan.<br />
Vielleicht gibt's ja auch noch mehr Leute die Bücher lesen und es steht noch nicht alles drin. oder ist dieses Problem so dämlich das man sich damit garnicht erst beschäftigen sollte?</p>
<p>mfG, cris</p>
]]></description><link>https://www.c-plusplus.net/forum/post/987877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/987877</guid><dc:creator><![CDATA[cris492]]></dc:creator><pubDate>Mon, 06 Feb 2006 18:56:07 GMT</pubDate></item><item><title><![CDATA[Reply to Buchempfehlung C++ templates + Vererbung on Mon, 06 Feb 2006 20:29:13 GMT]]></title><description><![CDATA[<p>cris492 schrieb:</p>
<blockquote>
<p>Er ruft dann op+=( const U&amp; zahl) mit U = NumericVector&lt;float&gt; auf.</p>
</blockquote>
<p>Kann ich ehrlich gesagt nicht nachvollziehen. U sollte eigentlich was sein?<br />
Mach mal ein Minimalbeispiel (also keine Implementationsdetails), mit Basisklasse und abgeleiteter Klasse, dem op+= und einem Aufruf davon, wo etwas nicht so läuft, wie du dir das vorstellst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/988061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/988061</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Mon, 06 Feb 2006 20:29:13 GMT</pubDate></item><item><title><![CDATA[Reply to Buchempfehlung C++ templates + Vererbung on Tue, 07 Feb 2006 08:39:56 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>cris492 schrieb:</p>
<blockquote>
<p>Er ruft dann op+=( const U&amp; zahl) mit U = NumericVector&lt;float&gt; auf.</p>
</blockquote>
<p>Kann ich ehrlich gesagt nicht nachvollziehen.</p>
</blockquote>
<p>Ich gehe mal davon aus, dass der OP in etwa folgende Situation hat:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Vector {
public:
	template &lt;class U&gt;
	Vector&lt;T&gt;&amp; operator+=(const Vector&lt;U&gt;&amp; other) {
		cout &lt;&lt; &quot;Hallo&quot; &lt;&lt; endl;
		return *this;
	}

	template &lt;class U&gt;
	Vector&lt;T&gt;&amp; operator+=(const U&amp; other) {
		cout &lt;&lt; &quot;Huhu&quot; &lt;&lt; endl;
		return *this;
	}
};

template &lt;class T&gt;
class NumericVector : public Vector&lt;T&gt; {};

int main() {
	NumericVector&lt;float&gt; x, y;
	x += y;

}
</code></pre>
<p>Ausgabe soll sein: &quot;Hallo&quot; ist aber natürlich &quot;Huhu&quot;.</p>
<p>OP:<br />
Falls ich mit dem Beispiel falsch liege, bitte unterbrich mich jetzt <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 />
Der Grund für das Verhalten hat nicht direkt etwas mit Vererbung zu tun. Vielmehr mit der Art und Weise wie Templates instanziiert werden und wie Überladung in C++ funktioniert.<br />
Für x += y gibt es prinzipiell zwei mögliche Überladungen. Entweder operator+=(const Vector&lt;U&gt;&amp; other) oder operator+=(const U&amp; other). Beide müssen zuvor instanziiert werden. Dazu muss ein passender Typ für U hergeleitet werden.<br />
Im ersten Fall ist U = float. Im zweiten ist U = NumericVector&lt;float&gt;. Also hast du letztlich:<br />
operator+=(const Vector&lt;float&gt;&amp; other)<br />
operator+=(const NumericVector&lt;float&gt;&amp; other)</p>
<p>Jetzt kommen die ganz normalen Überladungsregeln ins Spiel. Beide Überladungen sind aufrufbar. Die zweite wird aber bevorzugt, da sie ein &quot;exact match&quot; ist, wohingegen die erste eine &quot;derived-to-base&quot;-Konvertierung erfordert.</p>
<p>Lösungen gibt es viele. Von der Umstellung des Design bis zur Verwendung von <a href="http://www.boost.org/libs/utility/enable_if.html" rel="nofollow">boost::enable_if</a></p>
<p>Buchempfehlung zum Thema Templates ist einfach:<br />
&quot;C++ Templates: The Complete Guide&quot; von David Vandevoorde und Nicolai Josuttis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/988235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/988235</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Tue, 07 Feb 2006 08:39:56 GMT</pubDate></item><item><title><![CDATA[Reply to Buchempfehlung C++ templates + Vererbung on Tue, 07 Feb 2006 10:30:00 GMT]]></title><description><![CDATA[<p>Jawohl, das ist so genau mein Problem.</p>
<p>für den Compiler passt halt U = NumericVector&lt;float&gt; besser als<br />
Vector&lt;T&gt; = NumericVector&lt;T&gt; with T = float auch wenn es genau das ist was ich ja eigentlich will.</p>
<p>Vielen Dank für den Tip!</p>
<p>Über C++ Templates hab ich auch schon nachgedacht, war mir aber unsicher ob ich derartig schwere Lektüre schon verarbeiten kann.</p>
<p>Hab inzwischen mein Design auf Templates ohne Vererbung umgestellt,<br />
ein Freund gab mir den Tip Vererbung doch eher sparsam einzusetzen.</p>
<p>Würde die von Dir erwähnte &quot;derived-to-base&quot;-Konvertierung einen Konvertierungskonstruktor derived to base sinnvoll machen?<br />
Wenn ich den nicht schreibe erzeugt der Compiler selber einen, bzw. macht einen impliziten Cast, oder?</p>
<p>Vielen Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/988329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/988329</guid><dc:creator><![CDATA[cris492]]></dc:creator><pubDate>Tue, 07 Feb 2006 10:30:00 GMT</pubDate></item></channel></rss>