<?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[Welche Typen sind erlaubt?]]></title><description><![CDATA[<p>Abend,</p>
<p>Ich habe ein Klassentemplate und in einer Methode habe ich diese Zeile:</p>
<pre><code class="language-cpp">T entrySum = static_cast&lt;T&gt;(0);
</code></pre>
<p>Natürlich kann T jetzt jeder primitiver Typ wie float, int etc. sein. Aber könnte T nun auch eine Klasse wie complex sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243451/welche-typen-sind-erlaubt</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 01:53:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243451.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Jun 2009 20:14:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Welche Typen sind erlaubt? on Tue, 16 Jun 2009 20:14:28 GMT]]></title><description><![CDATA[<p>Abend,</p>
<p>Ich habe ein Klassentemplate und in einer Methode habe ich diese Zeile:</p>
<pre><code class="language-cpp">T entrySum = static_cast&lt;T&gt;(0);
</code></pre>
<p>Natürlich kann T jetzt jeder primitiver Typ wie float, int etc. sein. Aber könnte T nun auch eine Klasse wie complex sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727892</guid><dc:creator><![CDATA[klassa222]]></dc:creator><pubDate>Tue, 16 Jun 2009 20:14:28 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Typen sind erlaubt? on Tue, 16 Jun 2009 20:27:33 GMT]]></title><description><![CDATA[<p>Jeglicher Typ wird aktzeptiert, welcher einen Konstruktor hat, welcher eine 0 entgegen nehmen kann. Also auch <code>std::complex</code> sofern der übergebene Typ an <code>std::complex</code> einen impliziten Konstruktor hat, welcher eine 0 aktzeptieren kann.</p>
<p>Grüssli <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/1727896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727896</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 16 Jun 2009 20:27:33 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Typen sind erlaubt? on Tue, 16 Jun 2009 20:34:11 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Also auch <code>std::complex</code> sofern der übergebene Typ an <code>std::complex</code> einen impliziten Konstruktor hat, welcher eine 0 aktzeptieren kann.</p>
</blockquote>
<p>Ein expliziter Konstruktor geht auch, es handelt sich hier um eine explizite Typkonvertierung.</p>
<p>Ich freue mich diesbezüglich auch auf C++0x mit seinen expliziten Konvertierungsoperatoren. Dann ist es endlich möglich, <code>static_cast</code> auch vollständig mit Klassen einzusetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727899</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 16 Jun 2009 20:34:11 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Typen sind erlaubt? on Tue, 16 Jun 2009 20:34:50 GMT]]></title><description><![CDATA[<p>Ok, danke. Dann habe ich noch 2 kleine Fragen:</p>
<p>Die Funktion zum multiplizieren eines Skalars mit einem Vektor sieht bei mir so aus:</p>
<pre><code class="language-cpp">const Vector3&lt;T&gt; operator*(const T&amp; scalar, const Vector&lt;T&gt;3&amp; rhs);
</code></pre>
<p>1. Frage: Soll ich das so lassen mit der konstanten Referenz beim scalar, oder sollte ich da einfach ein T scalar draus machen?</p>
<p>Nur wenn ich jetzt 2 float-Vektoren anlege und mit einem int multipliziere:</p>
<pre><code class="language-cpp">Vector3&lt;float&gt; h1(2, 3, 5);
Vector3&lt;float&gt; h2(-1, 1, 2);

h2 = 2*h1;
</code></pre>
<p>bekomme ich folgenden Fehler:</p>
<blockquote>
<p>error C2679: binary '*' : no operator found which takes a right-hand operand of type 'Vector3&lt;T&gt;' (or there is no acceptable conversion)</p>
</blockquote>
<p>Das verstehe ich nicht. Für den Compiler sollte doch dann da stehen:</p>
<pre><code class="language-cpp">const Vector3&lt;float&gt; operator*(const float&amp; scalar, const Vector&lt;float&gt;3&amp; rhs);
</code></pre>
<p>und es sollte locker die 2 in einen const float&amp; gecasted werden können?<br />
2. Frage: Wieso geht das nicht? Was muss ich machen, damit das geht? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1727900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727900</guid><dc:creator><![CDATA[klassa222]]></dc:creator><pubDate>Tue, 16 Jun 2009 20:34:50 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Typen sind erlaubt? on Tue, 16 Jun 2009 20:41:36 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Also auch <code>std::complex</code> sofern der übergebene Typ an <code>std::complex</code> einen impliziten Konstruktor hat, welcher eine 0 aktzeptieren kann.</p>
</blockquote>
<p>Ein expliziter Konstruktor geht auch, es handelt sich hier um eine explizite Typkonvertierung.</p>
</blockquote>
<p>Nein, geht nicht! Probier es selber aus:</p>
<pre><code class="language-cpp">#include &lt;complex&gt;

class Test
{
public:
	Test() { };
	explicit Test(int) { }
};

template&lt;typename T&gt;
void foo()
{
	T entry = static_cast&lt;T&gt;(0);
}

int main()
{
	foo&lt;int&gt;();
	foo&lt;void*&gt;();
	foo&lt;Test&gt;();
	foo&lt;std::complex&lt;Test&gt; &gt;(); // Error

	return 0;
}
</code></pre>
<p>@klassa222,<br />
2 ist nach Standard ein <code>int</code> .<br />
2.0 ist nach Standard ein <code>double</code> .<br />
2.0f ist nach Standard ein <code>float</code> .</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727903</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 16 Jun 2009 20:41:36 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Typen sind erlaubt? on Tue, 16 Jun 2009 20:50:20 GMT]]></title><description><![CDATA[<p>Äh, es geht also NUR, wenn T einen impliziten Ctor mit einem Parameter hat, richtig?</p>
<blockquote>
<p>@klassa222,<br />
2 ist nach Standard ein int.<br />
2.0 ist nach Standard ein double.<br />
2.0f ist nach Standard ein float</p>
</blockquote>
<p>Ja, das weiß ich. Aber meine 2 Fragen aus meinem letzten Posting beantwortet das irgendwie nicht^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727906</guid><dc:creator><![CDATA[klassa2]]></dc:creator><pubDate>Tue, 16 Jun 2009 20:50:20 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Typen sind erlaubt? on Tue, 16 Jun 2009 20:52:45 GMT]]></title><description><![CDATA[<p>Dravere, sorry, ich bin wohl etwas müde. Ich habe das gemeint:</p>
<pre><code class="language-cpp">class MyClass
{
    public:
	    explicit MyClass(int i) {};
};

int main() 
{ 
	int i = 5;
	static_cast&lt;MyClass&gt;(i);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1727907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727907</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 16 Jun 2009 20:52:45 GMT</pubDate></item><item><title><![CDATA[Reply to Welche Typen sind erlaubt? on Tue, 16 Jun 2009 21:30:19 GMT]]></title><description><![CDATA[<p>Mal schauen, ob ich nicht auch schon zu müde bin, aber ich probier es, zu 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>klassa2 schrieb:</p>
<blockquote>
<p>Äh, es geht also NUR, wenn T einen impliziten Ctor mit einem Parameter hat, richtig?</p>
</blockquote>
<p>Nein, bei <code>T</code> ist es egal. Aber wenn du <code>std::complex</code> übergibst, dann muss der <code>std::complex&lt;Type&gt;::value_type</code> einen impliziten Konstruktor haben, welcher eine 0 aktzeptieren kann. Schau mein Beispiel an, welches ich dem Nexus gezeigt habe. Damit sollte es eigentlich klar werden.</p>
<p>klassa2 schrieb:</p>
<blockquote>
<p>Ja, das weiß ich. Aber meine 2 Fragen aus meinem letzten Posting beantwortet das irgendwie nicht^^</p>
</blockquote>
<p>Ok, Frage 1 ist einfach:<br />
Lass es bei der Referenz auf ein konstantes Objekt. Falls da mal ein grösseres Objekt übergeben werden sollte, ist die Referenz auf das konstante Objekt definitiv besser.</p>
<p>Zur Frage 2:<br />
Bevor die Funktion aufgerufen wird, wird sie vom Kompiler instanziert. Dabei probiert er den richtigen Typen für <code>T</code> zu finden. Du übergibst:<br />
1. Argument: <code>int</code><br />
2. Argument: <code>std::vector&lt;float&gt;</code><br />
Was soll nun <code>T</code> sein? <code>int</code> oder <code>float</code> ? Ist nicht klar, daher der Fehler.<br />
Deshalb muss man 2.0f angeben, damit beide Typen <code>float</code> sind und es keinen Fehler gibt, bzw. eindeutig ist.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1727922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1727922</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 16 Jun 2009 21:30:19 GMT</pubDate></item></channel></rss>