<?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[Operatoren und Implizite Konversion]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich habe das Problem, dass bei unten stehender Klasse die implizite Konversion bei den externen operatoren nicht funktioniert. Eigentlich wollte ich erreichen, dass man einen Vector direkt mit einer Zahl z.B. multiplizieren kann, ohne dass es eine Rolle spielt, auf welcher seite die Zahl steht. Leider weigert sich VC++ 2005 die Zahl in einen Vector umzuwandeln. Weiss jemand wieso?</p>
<p>Gruss</p>
<p>Stefan</p>
<pre><code class="language-cpp">#ifndef VECTOR_H
#define VECTOR_H

template&lt;typename T&gt;
struct Vector
{
	T x, y, z;

	Vector(T val = 0)
	{
		this-&gt;x = val;
		this-&gt;y = val;
		this-&gt;z = val;
	}

	Vector(T x, T y, T z)
	{
		this-&gt;x = x;
		this-&gt;y = y;
		this-&gt;z = z;
	}

	Vector&amp; operator += (const Vector &amp;vec)
	{
		this-&gt;x += vec.x;
		this-&gt;y += vec.y;
		this-&gt;z += vec.z;
		return *this;
	}

	Vector&amp; operator -= (const Vector &amp;vec)
	{
		this-&gt;x -= vec.x;
		this-&gt;y -= vec.y;
		this-&gt;z -= vec.z;
		return *this;
	}

	Vector&amp; operator *= (const Vector &amp;vec)
	{
		this-&gt;x *= vec.x;
		this-&gt;y *= vec.y;
		this-&gt;z *= vec.z;
		return *this;
	}

	Vector&amp; operator /= (const Vector &amp;vec)
	{
		this-&gt;x /= vec.x;
		this-&gt;y /= vec.y;
		this-&gt;z /= vec.z;
		return *this;
	}
};

template&lt;typename T&gt;
Vector&lt;T&gt; operator + (const Vector&lt;T&gt; &amp;v1, const Vector&lt;T&gt; &amp;v2)
{
	return Vector&lt;T&gt;(v1) += v2;
}

template&lt;typename T&gt;
Vector&lt;T&gt; operator - (const Vector&lt;T&gt; &amp;v1, const Vector&lt;T&gt; &amp;v2)
{
	return Vector&lt;T&gt;(v1) -= v2;
}

template&lt;typename T&gt;
Vector&lt;T&gt; operator * (const Vector&lt;T&gt; &amp;v1, const Vector&lt;T&gt; &amp;v2)
{
	return Vector&lt;T&gt;(v1) *= v2;
}

template&lt;typename T&gt;
Vector&lt;T&gt; operator / (const Vector&lt;T&gt; &amp;v1, const Vector&lt;T&gt; &amp;v2)
{
	return Vector&lt;T&gt;(v1) /= v2;
}

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/183193/operatoren-und-implizite-konversion</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 05:01:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/183193.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 02 Jun 2007 17:10:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operatoren und Implizite Konversion on Sat, 02 Jun 2007 17:10:40 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ich habe das Problem, dass bei unten stehender Klasse die implizite Konversion bei den externen operatoren nicht funktioniert. Eigentlich wollte ich erreichen, dass man einen Vector direkt mit einer Zahl z.B. multiplizieren kann, ohne dass es eine Rolle spielt, auf welcher seite die Zahl steht. Leider weigert sich VC++ 2005 die Zahl in einen Vector umzuwandeln. Weiss jemand wieso?</p>
<p>Gruss</p>
<p>Stefan</p>
<pre><code class="language-cpp">#ifndef VECTOR_H
#define VECTOR_H

template&lt;typename T&gt;
struct Vector
{
	T x, y, z;

	Vector(T val = 0)
	{
		this-&gt;x = val;
		this-&gt;y = val;
		this-&gt;z = val;
	}

	Vector(T x, T y, T z)
	{
		this-&gt;x = x;
		this-&gt;y = y;
		this-&gt;z = z;
	}

	Vector&amp; operator += (const Vector &amp;vec)
	{
		this-&gt;x += vec.x;
		this-&gt;y += vec.y;
		this-&gt;z += vec.z;
		return *this;
	}

	Vector&amp; operator -= (const Vector &amp;vec)
	{
		this-&gt;x -= vec.x;
		this-&gt;y -= vec.y;
		this-&gt;z -= vec.z;
		return *this;
	}

	Vector&amp; operator *= (const Vector &amp;vec)
	{
		this-&gt;x *= vec.x;
		this-&gt;y *= vec.y;
		this-&gt;z *= vec.z;
		return *this;
	}

	Vector&amp; operator /= (const Vector &amp;vec)
	{
		this-&gt;x /= vec.x;
		this-&gt;y /= vec.y;
		this-&gt;z /= vec.z;
		return *this;
	}
};

template&lt;typename T&gt;
Vector&lt;T&gt; operator + (const Vector&lt;T&gt; &amp;v1, const Vector&lt;T&gt; &amp;v2)
{
	return Vector&lt;T&gt;(v1) += v2;
}

template&lt;typename T&gt;
Vector&lt;T&gt; operator - (const Vector&lt;T&gt; &amp;v1, const Vector&lt;T&gt; &amp;v2)
{
	return Vector&lt;T&gt;(v1) -= v2;
}

template&lt;typename T&gt;
Vector&lt;T&gt; operator * (const Vector&lt;T&gt; &amp;v1, const Vector&lt;T&gt; &amp;v2)
{
	return Vector&lt;T&gt;(v1) *= v2;
}

template&lt;typename T&gt;
Vector&lt;T&gt; operator / (const Vector&lt;T&gt; &amp;v1, const Vector&lt;T&gt; &amp;v2)
{
	return Vector&lt;T&gt;(v1) /= v2;
}

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1297256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1297256</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Sat, 02 Jun 2007 17:10:40 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren und Implizite Konversion on Sat, 02 Jun 2007 18:05:51 GMT]]></title><description><![CDATA[<p>Hi,<br />
hmmmm lange Geschichte, ist wegen den Templates so. Hatten wir in letzter Zeit schon nen paar Mal hier. Ich suche mal nach nem Link, damit ich nichts schreiben muss <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/1297288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1297288</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 02 Jun 2007 18:05:51 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren und Implizite Konversion on Sat, 02 Jun 2007 18:09:03 GMT]]></title><description><![CDATA[<p>Siehe da : <a href="http://c-plusplus.net/forum/viewtopic-var-t-is-161613-and-highlight-is-.html" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-t-is-161613-and-highlight-is-.html</a> Ich hatte auch mal diese Frage gestellt <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/1297290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1297290</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 02 Jun 2007 18:09:03 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren und Implizite Konversion on Sat, 02 Jun 2007 18:13:05 GMT]]></title><description><![CDATA[<p>Und hier auch noch nen Link, wo du auch direkt siehst wie es bei dir aussehen musst, damits funktioniert, wenn du noch eine zusätzliche Erklärung brauchst, dann kriegste wieder ein paar Links <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/1297292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1297292</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 02 Jun 2007 18:13:05 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren und Implizite Konversion on Sat, 02 Jun 2007 18:22:40 GMT]]></title><description><![CDATA[<p>Für Parameter, die zur Deduktion von Templateparametern genutzt werden, sind die meisten impliziten Konvertierungen (und selbstdefinierte sowieso) unterdrückt. Etwas Anderes würde zu viele Mehrdeutigkeiten produzieren; aus dem gleichen Grunde kann eine implizite Konvertierungssequenz immer nur höchtens einen selbstdefinierten Operator/Konstruktor enthalten. Wie so oft gibt es mehr als eine Möglichkeit, das Problem zu umgehen:<br />
1. an Stelle von Templates verwenden wir normale Funktionen, und überladen für jeden Templateparameter:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct Vector
{
...
friend Vector operator + (const Vector &amp;v1, const Vector &amp;v2)
{
    return Vector(v1) += v2;
}
...
};
</code></pre>
<p>Im Allgemeinen sollte man mit diesem Verfahren vorsichtig sein, weil das komplette Set überladener Funktionen davon abhängt, welche Templates instantiiert wurden. In diesem Falle sehe ich da allerdings keine Probleme.</p>
<p>2. wir deduzieren verschiedene Templateparameter und verlassen uns darauf, dass für fehlerhafte Paramater das Instantiieren fehlschlägt:</p>
<pre><code class="language-cpp">template&lt;typename T, typename U&gt;
Vector&lt;T&gt; operator + (const U &amp;v1, const Vector&lt;T&gt; &amp;v2)
{
    return Vector&lt;T&gt;(v2) += v1;
}

template&lt;typename T, typename U&gt;
Vector&lt;T&gt; operator + (const Vector&lt;T&gt; &amp;v1, const U &amp;v2)
{
    return Vector&lt;T&gt;(v1) += v2;
}

template&lt;typename T, typename U&gt;
Vector&lt;T&gt; operator + (const Vector&lt;U&gt; &amp;v1, const Vector&lt;T&gt; &amp;v2)
{
    return Vector&lt;T&gt;(v1) += v2;
}
</code></pre>
<p>3. etwas verfeinert könnten wir auch einen Parametr zwar vom Templateparameter abhängig machen, aber so, dass ein nicht deduzierbarer Kontext ensteht:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; struct Identity { typedef T type; }; // die einfachsten Konstrukte sind oft sehr nützlich

template&lt;typename T&gt;
Vector&lt;T&gt; operator + (const typename Identity&lt;Vector&lt;T&gt; &gt;::type &amp;v1, const Vector&lt;T&gt; &amp;v2) // Linker Parameter ist nicht deduzierbar
{
    return Vector&lt;T&gt;(v2) += v1;
}

template&lt;typename T, typename U&gt;
Vector&lt;T&gt; operator + (const Vector&lt;T&gt; &amp;v1, const typename Identity&lt;Vector&lt;T&gt; &gt;::type &amp;v2)
{
    return Vector&lt;T&gt;(v1) += v2;
}

template&lt;typename T&gt;
Vector&lt;T&gt; operator + (const Vector&lt;T&gt; &amp;v1, const Vector&lt;T&gt; &amp;v2)
{
    return Vector&lt;T&gt;(v1) += v2;
}
</code></pre>
<p>das sind die Möglichkeiten, die mir unmittelbar einfallen - sicher gibt es noch mehr</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1297303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1297303</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 02 Jun 2007 18:22:40 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren und Implizite Konversion on Sat, 02 Jun 2007 18:35:23 GMT]]></title><description><![CDATA[<p>Danke euch beiden! <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/1297316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1297316</guid><dc:creator><![CDATA[__Stefan__]]></dc:creator><pubDate>Sat, 02 Jun 2007 18:35:23 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren und Implizite Konversion on Sat, 02 Jun 2007 18:41:04 GMT]]></title><description><![CDATA[<p>Uuups:</p>
<p>KasF schrieb:</p>
<blockquote>
<p>Und hier auch noch nen Link, wo du auch direkt siehst wie es bei dir aussehen musst, damits funktioniert, wenn du noch eine zusätzliche Erklärung brauchst, dann kriegste wieder ein paar Links <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><a href="http://www.parashift.com/c++-faq-lite/templates.html#faq-35.16" rel="nofollow">http://www.parashift.com/c++-faq-lite/templates.html#faq-35.16</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1297320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1297320</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 02 Jun 2007 18:41:04 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren und Implizite Konversion on Sat, 02 Jun 2007 21:30:58 GMT]]></title><description><![CDATA[<p>hi,<br />
KasF, Ubr und hustbaer haben mir vor kurzem bei einem ähnlichen Problem sehr geholfen. Vielleicht nützen dir einige Details meiner Matrixklasse (an der ich gerade wieder rumprogrammiere), denn die Operatorüberladung funktioniert nun.</p>
<p><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-182721.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-182721.html</a></p>
<p>vg tesu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1297450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1297450</guid><dc:creator><![CDATA[tesuji]]></dc:creator><pubDate>Sat, 02 Jun 2007 21:30:58 GMT</pubDate></item></channel></rss>