<?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[Operator * überladen]]></title><description><![CDATA[<p>hi,</p>
<p>irgendwie hab ich mit VC++ Express Edition Probleme... Ich mach erstmal ein Beispiel (Die auskommentierten Zeilen sind eigentlich die wichtigen):</p>
<pre><code class="language-cpp">class test
{
public:
    test operator * (int i)
    {
        return test();
    };
};

int main()
{
    test t;
    // t = 5 * t; //&lt;- Funktioniert nicht, da laut MSVC++ der operator * nicht definiert sei
    // t = t * 5; //&lt;- Funktioniert
}
</code></pre>
<p>Die genau Fehlermeldung bei der ersten auskommentierten Zeile is:<br />
&quot;no global operator found which takes type 'test' (or there is no acceptable conversion)&quot;<br />
Die zweite Zeile geht wie gesagt...<br />
Das Verhalten erscheint mit äußerst komisch, da der Compiler ja eigentlich die Reihenfolge vertauschen kann wie er will, solang ich nicht zwei in der Reihenfolge verschiedene Operatoren definier.</p>
<p>So, jetzt hab ich mal den operator global gemacht, dann kommt folgende Meldung:<br />
&quot;error C2678: binary '*' : no operator found which takes a left-hand operand of type 'int' (or there is no acceptable conversion)<br />
.\main.cpp(17): could be 'test operator *(const test &amp;,int)'<br />
while trying to match the argument list '(int, test)'&quot;</p>
<p>Kann man dem Compiler beibiegen (ohne zweimal den gleichen Operator nur mit umgekehrter Operandenreihenfolge zu schreiben), dass der Operator kommutativ ist? Bis jetzt ist mir irgendwie dieses Verhalten nicht untergekommen, deshalb glaub ich, dass es am Compiler liegt...</p>
<p>Danke für alle Antworten im voraus! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/144499/operator-überladen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 16:20:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/144499.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Apr 2006 23:09:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operator * überladen on Tue, 18 Apr 2006 23:09:25 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>irgendwie hab ich mit VC++ Express Edition Probleme... Ich mach erstmal ein Beispiel (Die auskommentierten Zeilen sind eigentlich die wichtigen):</p>
<pre><code class="language-cpp">class test
{
public:
    test operator * (int i)
    {
        return test();
    };
};

int main()
{
    test t;
    // t = 5 * t; //&lt;- Funktioniert nicht, da laut MSVC++ der operator * nicht definiert sei
    // t = t * 5; //&lt;- Funktioniert
}
</code></pre>
<p>Die genau Fehlermeldung bei der ersten auskommentierten Zeile is:<br />
&quot;no global operator found which takes type 'test' (or there is no acceptable conversion)&quot;<br />
Die zweite Zeile geht wie gesagt...<br />
Das Verhalten erscheint mit äußerst komisch, da der Compiler ja eigentlich die Reihenfolge vertauschen kann wie er will, solang ich nicht zwei in der Reihenfolge verschiedene Operatoren definier.</p>
<p>So, jetzt hab ich mal den operator global gemacht, dann kommt folgende Meldung:<br />
&quot;error C2678: binary '*' : no operator found which takes a left-hand operand of type 'int' (or there is no acceptable conversion)<br />
.\main.cpp(17): could be 'test operator *(const test &amp;,int)'<br />
while trying to match the argument list '(int, test)'&quot;</p>
<p>Kann man dem Compiler beibiegen (ohne zweimal den gleichen Operator nur mit umgekehrter Operandenreihenfolge zu schreiben), dass der Operator kommutativ ist? Bis jetzt ist mir irgendwie dieses Verhalten nicht untergekommen, deshalb glaub ich, dass es am Compiler liegt...</p>
<p>Danke für alle Antworten im voraus! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040173</guid><dc:creator><![CDATA[bluecode]]></dc:creator><pubDate>Tue, 18 Apr 2006 23:09:25 GMT</pubDate></item><item><title><![CDATA[Reply to Operator * überladen on Tue, 18 Apr 2006 23:19:29 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class test 
{ 
public: 
    test operator * (int i) 
    { 
        return test(); 
    }; 

    friend test operator * (int i, const test&amp; t)
    {
        return test();
    };
}; 

int main() 
{ 
    test t; 
    t = 5 * t;
    t = t * 5;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1040177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040177</guid><dc:creator><![CDATA[Neku]]></dc:creator><pubDate>Tue, 18 Apr 2006 23:19:29 GMT</pubDate></item><item><title><![CDATA[Reply to Operator * überladen on Tue, 18 Apr 2006 23:34:07 GMT]]></title><description><![CDATA[<p>Danke für die schnelle antwort, aber des is eigentlich genau das, was ich net will: Den gleichen Operator zwei mal nur mit umgekehrter Parameterliste zu schreiben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040182</guid><dc:creator><![CDATA[bluecode]]></dc:creator><pubDate>Tue, 18 Apr 2006 23:34:07 GMT</pubDate></item><item><title><![CDATA[Reply to Operator * überladen on Tue, 18 Apr 2006 23:47:51 GMT]]></title><description><![CDATA[<p>vielleicht eher so?</p>
<pre><code class="language-cpp">class test 
{ 
public: 
    test operator * (int i) 
    { //tutwasrechnen();
        return test(); 
    }; 

    friend test operator * (int i, const test&amp; t)
    {//tut nur weiterreichen
        return t*i;
    };
}; 

int main() 
{ 
    test t; 
    t = 5 * t;
    t = t * 5;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1040189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040189</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 18 Apr 2006 23:47:51 GMT</pubDate></item><item><title><![CDATA[Reply to Operator * überladen on Tue, 18 Apr 2006 23:53:31 GMT]]></title><description><![CDATA[<p>Danke, ich dachts mir eigentlich fast, wollts aber net wahrhaben...</p>
<p>Mich würd aber denoch interessieren, ob das Beispiel mit den auskommentierten Zeilen zu kompilieren geht oder net.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040192</guid><dc:creator><![CDATA[bluecode]]></dc:creator><pubDate>Tue, 18 Apr 2006 23:53:31 GMT</pubDate></item><item><title><![CDATA[Reply to Operator * überladen on Wed, 19 Apr 2006 05:53:55 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Mit diesem Operator kannst du das Beispiel compilieren.</p>
<pre><code class="language-cpp">friend test operator * (int i, const test&amp; t)
{//tut nur weiterreichen
    return t*i;
};
</code></pre>
<p>bluecode schrieb:</p>
<blockquote>
<p>aber des is eigentlich genau das, was ich net will: Den gleichen Operator zwei mal nur mit umgekehrter Parameterliste zu schreiben...</p>
</blockquote>
<p>An sowas kommt man eben manchmal nicht vorbei. Außerdem ist es logisch das du mit deiner ersten Version nicht alle Fälle abdecken kannst.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040231</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 19 Apr 2006 05:53:55 GMT</pubDate></item><item><title><![CDATA[Reply to Operator * überladen on Wed, 19 Apr 2006 06:20:43 GMT]]></title><description><![CDATA[<p>Du könntest auch nur den globalen Operator verwenden:</p>
<pre><code class="language-cpp">class test
{
public:
  test();
  test(int val);
  ...
};

test operator*(const test&amp; l,const test&amp;r)
{
  //rechne irgendwas
  return test();
}

int main()
{
  test t;
  t=t*5;
  t=5*t;
}
</code></pre>
<p>(der int-Ctor wandelt die 5'en jeweils in ein &quot;test&quot;-Objekt um - und damit solltest du dann umgehen können)</p>
<p>PS: Ja, ich weiß - mit einem spezialisierten Operator bist du vermutlich etwas schneller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040243</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 19 Apr 2006 06:20:43 GMT</pubDate></item><item><title><![CDATA[Reply to Operator * überladen on Wed, 19 Apr 2006 12:10:18 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a>: Ne ganz andere Frage: Wieso verwendest du bei denem Operator das Schlüsselword friend... Hat das ne spezielle Bedeutung bei Operatoren?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: Des funktioniert in meinem Spezialfall dann leider net (ich hab ja oben nur ein Beispiel zur Verdeutlichung gemacht), da ich aus nem Skalar net einfach nen Vektor machen kann, da Skalarmultiplikation halt was anderes wie Kreuz/Punktprodukt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1040498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040498</guid><dc:creator><![CDATA[bluecode]]></dc:creator><pubDate>Wed, 19 Apr 2006 12:10:18 GMT</pubDate></item><item><title><![CDATA[Reply to Operator * überladen on Wed, 19 Apr 2006 12:16:40 GMT]]></title><description><![CDATA[<p>bluecode schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a>: Ne ganz andere Frage: Wieso verwendest du bei denem Operator das Schlüsselword friend... Hat das ne spezielle Bedeutung bei Operatoren?</p>
</blockquote>
<p>friend ist notwendig, wenn der operator (als globale Funktion steht der außerhalb der Klasse) auf die privaten Member deiner Vektorklasse zugreifen muß. (das geht nicht nur mit Operatoren, sondern mit jeder &quot;fremden&quot; Funktion - und sogar mit kompletten Klassen)</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: Des funktioniert in meinem Spezialfall dann leider net (ich hab ja oben nur ein Beispiel zur Verdeutlichung gemacht), da ich aus nem Skalar net einfach nen Vektor machen kann, da Skalarmultiplikation halt was anderes wie Kreuz/Punktprodukt ist.</p>
</blockquote>
<p>Wenn das so ist, bleibt dir doch nur volkards Variante (wobei - da der globale op* nur den Member-Operator aufruft, kann da das friend auch wegfallen):</p>
<pre><code class="language-cpp">class test
{
public:
  test operator*(int r);
};

test operator*(int l,const test&amp; r)
{ return r*l; }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1040503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1040503</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 19 Apr 2006 12:16:40 GMT</pubDate></item></channel></rss>