<?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 und CAST Überladung]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin noch recht neu in C++ und lerne es gerade im Informatik Studium.<br />
Ich versuche gerade eine Template Klasse in einer anderen Funktion in zwei Datentypen zu kasten, dazu ist der eine Datentyp double und der andere das Template.</p>
<p>Habe einen kleinen Beispielscode aufgebaut, der wie folgt aussieht:</p>
<pre><code>#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

template &lt;typename T&gt;
class Test
{
private:
	T val;
public:
	Test(T val){
		this-&gt;val = val;
	}

	operator double(){
		return 5.0;
	}

	operator T(){
		return this-&gt;val;
	}
};

template &lt;typename T&gt;
class Tst
{
public:
	template &lt;typename C&gt;
	void printVal(Test&lt;T&gt; *v){
		cout &lt;&lt; (C)*v &lt;&lt; endl; //EDIT: War vorher cout &lt;&lt; (C)v &lt;&lt; endl;
	}

	void print(Test&lt;T&gt; *v){
		this-&gt;printVal&lt;double&gt;(v);
		this-&gt;printVal&lt;T&gt;(v);
	}
};

int main()
{
	Test&lt;string&gt; *t = new Test&lt;string&gt;(&quot;Hello World!&quot;);
	Tst&lt;string&gt; *t2 = new Tst&lt;string&gt;();

	t2-&gt;print(t);

	system(&quot;PAUSE&quot;);
	return EXIT_SUCCESS;
}
</code></pre>
<p>Von VS selbst bekomme ich keinen Fehler, erst beim kompilieren sagt der Kompiler:</p>
<blockquote>
<p>Fehler 1 error C2440: 'Typumwandlung': 'Test&lt;T&gt; *' kann nicht in 'double' konvertiert werden c:\users\viktor\documents\visual studio 2012\projects\ooap2.2\ooap2.2\main.cpp 34 1 OOAP2.2</p>
</blockquote>
<p>Was mache ich falsch? <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/topic/324885/templates-und-cast-überladung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Jul 2026 12:39:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324885.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 06 Apr 2014 12:33:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 18:00:54 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin noch recht neu in C++ und lerne es gerade im Informatik Studium.<br />
Ich versuche gerade eine Template Klasse in einer anderen Funktion in zwei Datentypen zu kasten, dazu ist der eine Datentyp double und der andere das Template.</p>
<p>Habe einen kleinen Beispielscode aufgebaut, der wie folgt aussieht:</p>
<pre><code>#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

template &lt;typename T&gt;
class Test
{
private:
	T val;
public:
	Test(T val){
		this-&gt;val = val;
	}

	operator double(){
		return 5.0;
	}

	operator T(){
		return this-&gt;val;
	}
};

template &lt;typename T&gt;
class Tst
{
public:
	template &lt;typename C&gt;
	void printVal(Test&lt;T&gt; *v){
		cout &lt;&lt; (C)*v &lt;&lt; endl; //EDIT: War vorher cout &lt;&lt; (C)v &lt;&lt; endl;
	}

	void print(Test&lt;T&gt; *v){
		this-&gt;printVal&lt;double&gt;(v);
		this-&gt;printVal&lt;T&gt;(v);
	}
};

int main()
{
	Test&lt;string&gt; *t = new Test&lt;string&gt;(&quot;Hello World!&quot;);
	Tst&lt;string&gt; *t2 = new Tst&lt;string&gt;();

	t2-&gt;print(t);

	system(&quot;PAUSE&quot;);
	return EXIT_SUCCESS;
}
</code></pre>
<p>Von VS selbst bekomme ich keinen Fehler, erst beim kompilieren sagt der Kompiler:</p>
<blockquote>
<p>Fehler 1 error C2440: 'Typumwandlung': 'Test&lt;T&gt; *' kann nicht in 'double' konvertiert werden c:\users\viktor\documents\visual studio 2012\projects\ooap2.2\ooap2.2\main.cpp 34 1 OOAP2.2</p>
</blockquote>
<p>Was mache ich falsch? <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/2393017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393017</guid><dc:creator><![CDATA[ViktorM]]></dc:creator><pubDate>Sun, 06 Apr 2014 18:00:54 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 12:43:02 GMT]]></title><description><![CDATA[<p>ViktorM schrieb:</p>
<blockquote>
<p>Was mache ich falsch? <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>
</blockquote>
<p>Du kannst Zeiger und das, worauf sie zeigen, nicht auseinanderhalten.</p>
<p>Darauf gibt es zwei mögliche Antworten, je nach Philosophie. Die erste ist: Benutze einfach keine Zeiger. Das ist in deinem Fall auch weder nötig noch sinnvoll. Die zweite ist: Lerne erstmal einfache Sachen wie Zeiger, bevor du dich mit kompliziertem Kram wie Templates auseinandersetzt. Such dir eine aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393018</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sun, 06 Apr 2014 12:43:02 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 13:56:43 GMT]]></title><description><![CDATA[<p>Haha danke für die coole Antwort <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>
<p>Zeiger haben wir im ersten Semester gelernt und ich kann sie sehr wohl schon anwenden, habe nur noch nicht viel Übung darin. Mit deinem Hinweis ;), habe ich meinen Fehler aber gefunden:</p>
<pre><code>template &lt;typename C&gt;
	void printVal(Test&lt;T&gt; *v){
		cout &lt;&lt; (C)*v &lt;&lt; endl;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2393024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393024</guid><dc:creator><![CDATA[ViktorM]]></dc:creator><pubDate>Sun, 06 Apr 2014 13:56:43 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 16:11:10 GMT]]></title><description><![CDATA[<p>Und damit hälst du dir nur die Augen zu, damit du den (oder die) Fehler nicht sehen musst.</p>
<p>Und dem Compiler setzt du einen Knebel auf...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393037</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 06 Apr 2014 16:11:10 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 16:28:53 GMT]]></title><description><![CDATA[<p>Welche Fehler denn?</p>
<p>Wieso seid ihr eigentlich so komisch drauf? Habe doch nur eine Frage gestellt, wenn ihr nicht helfen wollt, dann schreibt am besten einfach gar nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393039</guid><dc:creator><![CDATA[ViktorM]]></dc:creator><pubDate>Sun, 06 Apr 2014 16:28:53 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 16:41:49 GMT]]></title><description><![CDATA[<p>ViktorM schrieb:</p>
<blockquote>
<p>Wieso seid ihr eigentlich so komisch drauf? Habe doch nur eine Frage gestellt, wenn ihr nicht helfen wollt, dann schreibt am besten einfach gar nichts.</p>
</blockquote>
<p>Skym0sh0 hat ja geholfen. Um seine Analogie noch deutlicher zu machen: Mit dem C-Cast löst du keine Probleme, sondern bringst höchstens den Compiler zum Schweigen und umgehst Typsicherheit. Du solltest dir lieber überlegen, was du genau tun willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393042</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 06 Apr 2014 16:41:49 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 16:41:45 GMT]]></title><description><![CDATA[<p>Der hat einen operator double geschrieben, das Problem war, dass der nicht aufgerufen wurde, weil er einen Pointer hatte und kein Objekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393043</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 06 Apr 2014 16:41:45 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 16:53:53 GMT]]></title><description><![CDATA[<p>Verstehe noch nicht ganz, wieso wird da die Typsicherheit verletzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393044</guid><dc:creator><![CDATA[ViktorM]]></dc:creator><pubDate>Sun, 06 Apr 2014 16:53:53 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 17:16:35 GMT]]></title><description><![CDATA[<p>ViktorM schrieb:</p>
<blockquote>
<p>Verstehe noch nicht ganz, wieso wird da die Typsicherheit verletzt?</p>
</blockquote>
<p>Nirgendwo (außer aus designtechnischen Gründen wegen impliziter Konvertierung und so).<br />
Nexus und Skymosho dachten, du castest einfach einen Pointer nach double.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393047</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 06 Apr 2014 17:16:35 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 17:47:33 GMT]]></title><description><![CDATA[<p>Da hatten sie auch recht im ersten Eintrag, habe aber gemerkt, dass ich da den * Operator vergessen habe. Also mir fällt auf Anhieb nur ein, dass es dann zu Problemen kommt, wenn die Template Methode (printVal) nur dann gefährlich (schlecht) ist, wenn sie public oder protected ist (sprich, wenn andere Programmierer darauf zugreifen können) aber solange sie private ist, kann darauf sonst keiner zugreifen und der der dann an der Klasse arbeitet muss sich eben daran halten, das außer double und T keine anderen Datentypen da übergeben werden dürfen.</p>
<p>Habe das im eigentlichen Projekt so umgesetzt und mir eine Kopie der Funktion eben nur für den anderen Datentyp erspart.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393056</guid><dc:creator><![CDATA[ViktorM]]></dc:creator><pubDate>Sun, 06 Apr 2014 17:47:33 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 18:02:56 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Nexus und Skymosho dachten, du castest einfach einen Pointer nach double.</p>
</blockquote>
<p>Ich glaube nicht, dass das direkt geht, aber C-Casts in generischem Code sind gefährlich. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
<p>Zumindest solange man die einzelnen Semantiken nicht genaustens kennt, würde ich empfehlen, <code>static_cast</code> einzusetzen. Ich persönlich würde auch nachher auf C- und Function-Style-Casts verzichten. Aber einige Leute beklagen sich dann über zusätzliche Schreibarbeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393061</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 06 Apr 2014 18:02:56 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 18:09:10 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Nexus und Skymosho dachten, du castest einfach einen Pointer nach double.</p>
</blockquote>
<p>....</p>
</blockquote>
<p>Ok, mein Fehler.<br />
Ziehe alles zurück, behaupte das Gegenteil und du hast natürlich Recht mit deinen Bedenken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393065</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 06 Apr 2014 18:09:10 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 19:16:07 GMT]]></title><description><![CDATA[<p>Ehh verstehe ich gerade nicht <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>
<p>Warum sind die gefährlich? Können damit schnell Sicherheitslücken entstehen?<br />
Und was bedeutet C-Casts?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393073</guid><dc:creator><![CDATA[ViktorM]]></dc:creator><pubDate>Sun, 06 Apr 2014 19:16:07 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 20:03:39 GMT]]></title><description><![CDATA[<pre><code>// C-Cast
(T) expr

// Function Style Cast (T skalarer Typ)
T(expr)

// C++-Casts
static_cast&lt;T&gt;(expr)
const_cast&lt;T&gt;(expr)
reinterpret_cast&lt;T&gt;(expr)
dynamic_cast&lt;T&gt;(expr)
</code></pre>
<p>Bei den C++-Castoperatoren ist die Funktionalität aufgeteilt. Du weisst also genau, welche Art von Konvertierung für jeden Operator in Frage kommt, und erkennst diese anhand des Codes. Bei C- und Function-Style-Cast versucht der Compiler, einen oder mehr der ersten drei C++-Äquivalente anzuwenden. Du kannst dadurch sehr schnell ungewollte Konvertierungen haben, besonders in generischem Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393083</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 06 Apr 2014 20:03:39 GMT</pubDate></item><item><title><![CDATA[Reply to Templates und CAST Überladung on Sun, 06 Apr 2014 23:27:48 GMT]]></title><description><![CDATA[<p>ViktorM schrieb:</p>
<blockquote>
<p>und der der dann an der Klasse arbeitet muss sich eben daran halten, das außer double und T keine anderen Datentypen da übergeben werden dürfen.</p>
</blockquote>
<p>Und da drin siehst du kein Problem? Wenn du den Code in 2 Wochen nochmal benutzen willst hast du es vergessen und übergibst was anderes. Und weil du einen Cast benutzt warnt dich der Compiler nicht, sondern macht den Schwachsinn auch noch den du geschrieben hast. Man kann in C++ einfach hinschreiben, dass man nur double und T übergeben darf und dann hilft der Compiler dir korrekten Code zu schreiben.<br />
Die Doku, die du nicht geschrieben hast, liest eh keiner<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/2122.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--trade_mark"
      title=":trade_mark:"
      alt="™"
    />.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2393097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2393097</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Sun, 06 Apr 2014 23:27:48 GMT</pubDate></item></channel></rss>