<?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[conversion operator erzeugt zuviele Interpretationen von operator ==]]></title><description><![CDATA[<p>Ich habe eine Stringklasse:</p>
<pre><code class="language-cpp">class SString
{
  ....
  operator   char* ()    { return _str; }
  int operator == (const char*);        

  //int operator == (const SString&amp;);                    // dasselbe Problem 
  //friend int operator == (const SString&amp;, const char*);// dasselbe Problem 
  ...
};
</code></pre>
<p>Das hat mit dem Borland Compiler gut funktioniert. Der hat also den Operator ausgewählt, für den keine Conversion erforderlich ist.</p>
<p>Doch der MS-Compiler will sich nicht entscheiden, ob er den Klassen-Operator<br />
SString == char*,<br />
oder den C++ built-in Operator<br />
char* == char*<br />
benutzen soll. Wenn ich auf den Conversions Operator verzichte, müsste ich wohl an recht vielen Programmstellen eine explizite Konvertierung einfügen.</p>
<p>Gibt es einen Weg das aufzulösen?<br />
hg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/167582/conversion-operator-erzeugt-zuviele-interpretationen-von-operator</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 01:31:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/167582.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Dec 2006 17:47:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Tue, 12 Dec 2006 17:57:05 GMT]]></title><description><![CDATA[<p>Ich habe eine Stringklasse:</p>
<pre><code class="language-cpp">class SString
{
  ....
  operator   char* ()    { return _str; }
  int operator == (const char*);        

  //int operator == (const SString&amp;);                    // dasselbe Problem 
  //friend int operator == (const SString&amp;, const char*);// dasselbe Problem 
  ...
};
</code></pre>
<p>Das hat mit dem Borland Compiler gut funktioniert. Der hat also den Operator ausgewählt, für den keine Conversion erforderlich ist.</p>
<p>Doch der MS-Compiler will sich nicht entscheiden, ob er den Klassen-Operator<br />
SString == char*,<br />
oder den C++ built-in Operator<br />
char* == char*<br />
benutzen soll. Wenn ich auf den Conversions Operator verzichte, müsste ich wohl an recht vielen Programmstellen eine explizite Konvertierung einfügen.</p>
<p>Gibt es einen Weg das aufzulösen?<br />
hg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190774</guid><dc:creator><![CDATA[hgf]]></dc:creator><pubDate>Tue, 12 Dec 2006 17:57:05 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Tue, 12 Dec 2006 18:46:56 GMT]]></title><description><![CDATA[<p>Poste doch mal den Ausdruck, der diesen Fehler erzeuget (mit Deklarationen versteht sich).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190801</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 12 Dec 2006 18:46:56 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Tue, 12 Dec 2006 19:16:30 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Poste doch mal den Ausdruck, der diesen Fehler erzeuget (mit Deklarationen versteht sich).</p>
</blockquote>
<p>ja, zum Bsp:</p>
<pre><code class="language-cpp">char  m_animal[40];
...
SString animal;
....
if( animal == m_animal)
{ ...
</code></pre>
<p>ERROR in IF-Zeile: could be 'int SString::operator ==(const char *)'<br />
or 'built-in C++ operator==(char *, char *)'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190823</guid><dc:creator><![CDATA[hgf]]></dc:creator><pubDate>Tue, 12 Dec 2006 19:16:30 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Tue, 12 Dec 2006 19:23:12 GMT]]></title><description><![CDATA[<p>Welcher compiler soll hier Schwierigkeiten haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190825</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 12 Dec 2006 19:23:12 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Tue, 12 Dec 2006 19:35:04 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Welcher compiler soll hier Schwierigkeiten haben?</p>
</blockquote>
<p>MS Visual C++, von der Express Edition. Den probiere ich gerade neu aus.<br />
Kenn mich also mit Switches und Einstellungen nicht besonders aus. Generell habe ich den Eindruck er ist mehr restriktiv und mehr auf Sicherheit ausgerichtet, als der Compiler von Borland.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190833</guid><dc:creator><![CDATA[hgf]]></dc:creator><pubDate>Tue, 12 Dec 2006 19:35:04 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Tue, 12 Dec 2006 19:45:18 GMT]]></title><description><![CDATA[<p>Kann ich nicht nachvollziehen, bitte kompilierbares Beispiel!</p>
<p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>D</mi><mi>e</mi><mi>r</mi><mi>V</mi><mi>o</mi><mi>l</mi><mi>l</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>e</mi><mi>c</mi><mi>k</mi><mi>e</mi><mi>r</mi></mrow><annotation encoding="application/x-tex">Der Vollstrecker</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.69444em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.02778em;">D</span><span class="mord mathit">e</span><span class="mord mathit" style="margin-right:0.02778em;">r</span><span class="mord mathit" style="margin-right:0.22222em;">V</span><span class="mord mathit">o</span><span class="mord mathit" style="margin-right:0.01968em;">l</span><span class="mord mathit" style="margin-right:0.01968em;">l</span><span class="mord mathit">s</span><span class="mord mathit">t</span><span class="mord mathit" style="margin-right:0.02778em;">r</span><span class="mord mathit">e</span><span class="mord mathit">c</span><span class="mord mathit" style="margin-right:0.03148em;">k</span><span class="mord mathit">e</span><span class="mord mathit" style="margin-right:0.02778em;">r</span></span></span></span></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190841</guid><dc:creator><![CDATA[Der Vollstrecker]]></dc:creator><pubDate>Tue, 12 Dec 2006 19:45:18 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Tue, 12 Dec 2006 20:14:59 GMT]]></title><description><![CDATA[<p>Der Vollstrecker schrieb:</p>
<blockquote>
<p>Kann ich nicht nachvollziehen, bitte kompilierbares Beispiel!</p>
<p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>D</mi><mi>e</mi><mi>r</mi><mi>V</mi><mi>o</mi><mi>l</mi><mi>l</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>e</mi><mi>c</mi><mi>k</mi><mi>e</mi><mi>r</mi></mrow><annotation encoding="application/x-tex">Der Vollstrecker</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.69444em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.02778em;">D</span><span class="mord mathit">e</span><span class="mord mathit" style="margin-right:0.02778em;">r</span><span class="mord mathit" style="margin-right:0.22222em;">V</span><span class="mord mathit">o</span><span class="mord mathit" style="margin-right:0.01968em;">l</span><span class="mord mathit" style="margin-right:0.01968em;">l</span><span class="mord mathit">s</span><span class="mord mathit">t</span><span class="mord mathit" style="margin-right:0.02778em;">r</span><span class="mord mathit">e</span><span class="mord mathit">c</span><span class="mord mathit" style="margin-right:0.03148em;">k</span><span class="mord mathit">e</span><span class="mord mathit" style="margin-right:0.02778em;">r</span></span></span></span></p>
</blockquote>
<p>Kompilierbares Beispiel. Kann das leider heute nicht mehr machen. (Weil ich dafür die Settings für eine Konsolenanwendung erst neu einstellen müsste.) Kann ich morgen machen.</p>
<p>Aber ich finde das Problem ist relativ klar aus der Error Meldung: der Konversions Operator verwandelt mein SString in ein char*. Und damit sind 2 Operatoren gleichzeitig prinzipiell auf die == Situation anwendbar.</p>
<p>Also der Compilierbare Code würde so aussehen:</p>
<pre><code class="language-cpp">int _tmain(int argc, _TCHAR* argv[])
{

	char animal[] = &quot;Fuchs&quot;;
	char* p       = animal;
	SString tier  = &quot;Ente&quot;

    if(tier == 	p)
	   return 1;
	return 0;
}
</code></pre>
<p>Nur ich habe noch nicht testen können, dass dies mit derselben Fehlermeldung NICHT compiliert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190851</guid><dc:creator><![CDATA[hgf]]></dc:creator><pubDate>Tue, 12 Dec 2006 20:14:59 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Tue, 12 Dec 2006 20:16:04 GMT]]></title><description><![CDATA[<p>Deine Settings gehen mir ehrlich gesagt am hcsrA vorbei. Folgendes funktioniert ohne Probleme:</p>
<pre><code class="language-cpp">struct Foo {
    int bar;
    Foo(int val) : bar(val) {}
    operator int() const { 
        return bar; 
    }
    friend bool operator==(Foo const&amp; foo, int val) { 
        return foo.bar == val; 
    }
};

int main() {
    return Foo(1) == 1;
}
</code></pre>
<p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>D</mi><mi>e</mi><mi>r</mi><mi>V</mi><mi>o</mi><mi>l</mi><mi>l</mi><mi>s</mi><mi>t</mi><mi>r</mi><mi>e</mi><mi>c</mi><mi>k</mi><mi>e</mi><mi>r</mi></mrow><annotation encoding="application/x-tex">Der Vollstrecker</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.69444em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit" style="margin-right:0.02778em;">D</span><span class="mord mathit">e</span><span class="mord mathit" style="margin-right:0.02778em;">r</span><span class="mord mathit" style="margin-right:0.22222em;">V</span><span class="mord mathit">o</span><span class="mord mathit" style="margin-right:0.01968em;">l</span><span class="mord mathit" style="margin-right:0.01968em;">l</span><span class="mord mathit">s</span><span class="mord mathit">t</span><span class="mord mathit" style="margin-right:0.02778em;">r</span><span class="mord mathit">e</span><span class="mord mathit">c</span><span class="mord mathit" style="margin-right:0.03148em;">k</span><span class="mord mathit">e</span><span class="mord mathit" style="margin-right:0.02778em;">r</span></span></span></span></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190863</guid><dc:creator><![CDATA[Der Vollstrecker]]></dc:creator><pubDate>Tue, 12 Dec 2006 20:16:04 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Tue, 12 Dec 2006 21:45:50 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/424">@hgf</a>: Habe bei mir das selbe Problem (<a href="http://MSVC++.NET" rel="nofollow">MSVC++.NET</a> 2003). Musst halt auch noch den == Operator mit char* überladen. Nervt gewaltig, aber sind halt die dollen eingebauten Operatoren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190905</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 12 Dec 2006 21:45:50 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Tue, 12 Dec 2006 23:40:30 GMT]]></title><description><![CDATA[<p>Der Microsoft Compiler hat natürlich recht, und es ist nur billig, dass dir ein solch schlechtes Design um die Ohren gehauen wird. Grundsätzlich sind Konvertierungsoperatoren und -konstruktoren mit großer Vorsicht zu genießen. Eine Funktion ist besser als eine andere für Zwecke der Überladungsauflösung, wenn die notwendige Konvertierungssequenz für <em>keinen</em> der Parameter dieser Funktion schlechter (im Rang) ist, als diejenige der anderen Funktion für den selben Parameter und wenigstens eine dieser Sequenzen besser ist, als die entsprechende Sequenz für die andere Funktion (Und dann noch ein paar Regeln für Templatefunktionen und eine spezielle Regel für Konvertierungsoperatoren, die hier keine Rolle spielen). Hier erfolgt also eine partielle Ordnung nicht zufällig analog der partiellen Ordnung von Spezialisierungen von Klassentemplates.</p>
<p>-Die erste Operatorüberladung 'int SString::operator ==(const char <em>)'<br />
erfordert keine (oder man könnte sie auch als identische K.-sequenz bezeichenn) Konvertierungssequenz für den ersten Parameter, aber eine Qualifikationskonvertierung (von char</em> auf const char*) für den 2.Parameter<br />
-Die zweite Operatorüberladung operator==(char *, char <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 />
dagegen erfordert die zweitschlechteste Form einer Konvertierungssequenz, nähmlich eine, die einen Nutzerdefinierten operator benötigt (schlechter sind Ellipsen), dagegen keine für den zweiten Parameter.</p>
<p>Die erste Überladung ist also besser für den ersten Operanden aber schlechter für den zweiten Operanden. Es ist also nur logisch und folgerichtig, wenn der Compiler hier eine Entscheidung verweigert. Im Übrigen ist das - wie erwähnt - nur Folge eines schlechten Designs und nicht ein Fehler der Sprachkonzeption.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190935</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 12 Dec 2006 23:40:30 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Wed, 13 Dec 2006 01:48:50 GMT]]></title><description><![CDATA[<p>@ Vollstrecker:</p>
<p>Habe das Beispiel jetzt mit einer künstlichen SString Klasse gemacht:</p>
<pre><code class="language-cpp">struct SString
 { char m_str[20];
   SString()   {;}  
   operator    char* ()    { return m_str; } 
   friend bool operator == (const SString&amp;, const SString&amp;) { return 1; }   
   friend bool operator == (const SString&amp;, const char* )   { return 0; }
 };

int main()
{
	char animal[] = &quot;Fuchs&quot;;
	char* p = animal;
	SString tier;
	SString tier2;
	if(tier == p)              // hier selbe Fehlermeldung  wie zuvor
            return 1;               // aber siehe unten        
	if(tier == tier2)          // ok
            return 1;
}
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@Camper</a></p>
<p>Weiss nicht, ob ich das mit dem Rang einer Konvertierungssequenz recht verstanden habe. Intuitiv finde ich, dass operator ==(const SString&amp;, const char <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="😉"
    /> gewählt werden sollte, wenn die Argumente entsprechend sind. Und so macht es der Compiler ja auch, wenn kein Conversion Operator definiert ist.</p>
<p>Aber Du hast mich darauf gebracht, auch die Umwandlung const - non-const als conversion zu berücksichtigen. Es stellt sich heraus, dass folgendes funktioniert (Veränderung zu oben ist die unterschiedliche Qualifikation von char* mit const):</p>
<pre><code class="language-cpp">operator    const char* ()    { return m_str; } 
   friend bool operator == (const SString&amp;, const SString&amp;) { return 1; }   
   friend bool operator == (const SString&amp;, const char* )   { return 0; }
</code></pre>
<p>ODER</p>
<pre><code class="language-cpp">operator    char* ()    { return m_str; } 
   friend bool operator == (const SString&amp;, const SString&amp;) { return 1; }   
   friend bool operator == (const SString&amp;, char* )         { return 0; }
</code></pre>
<p>also char* ist nun beide male gleichartig. Verstehen tu ich es noch nicht, aber zumindest kompiliert es jetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1190946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1190946</guid><dc:creator><![CDATA[hgf()]]></dc:creator><pubDate>Wed, 13 Dec 2006 01:48:50 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Wed, 13 Dec 2006 08:03:50 GMT]]></title><description><![CDATA[<p>Das Design is deshalb nich besser geworden. Das Template std::basic_string hat nicht umsonst keinen Konvertierungoperator sondern bietet hierzu die Methode c_str() an.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191005</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 13 Dec 2006 08:03:50 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Wed, 13 Dec 2006 09:16:46 GMT]]></title><description><![CDATA[<p>Was soll an dem Design schlecht sein? Wieso soll ein Konvertierungsoperator schlechter sein als ein c_str()? Schließlich besteht die Klasse nur aus einem char*, warum also keinen Konvertierungsoperator dafür einbauen?<br />
Man kann die Klasse intuitiv benutzen und es ergibt sich kein Nachteil! Was soll an diesem Design schlecht sein <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/1191041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191041</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 13 Dec 2006 09:16:46 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Wed, 13 Dec 2006 09:21:00 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Was soll an dem Design schlecht sein? Wieso soll ein Konvertierungsoperator schlechter sein als ein c_str()? Schließlich besteht die Klasse nur aus einem char*, warum also keinen Konvertierungsoperator dafür einbauen?<br />
Man kann die Klasse intuitiv benutzen und es ergibt sich kein Nachteil! Was soll an diesem Design schlecht sein <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>
</blockquote>
<p>An c_str() ist besser das man SString Objekte nicht &quot;ausversehen&quot; in char* umwandeln kann...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191042</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 13 Dec 2006 09:21:00 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Wed, 13 Dec 2006 10:34:19 GMT]]></title><description><![CDATA[<p>Ja, aber was ist dann an einem const char* Operator so schlecht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191084</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 13 Dec 2006 10:34:19 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Wed, 13 Dec 2006 12:00:13 GMT]]></title><description><![CDATA[<p>Das man evtl. fehlerhafte Übergaben an Funktionen wegen der impliziter Konvertierung nicht erkennt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191151</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 13 Dec 2006 12:00:13 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Wed, 13 Dec 2006 12:52:47 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Ja, aber was ist dann an einem const char* Operator so schlecht?</p>
</blockquote>
<p>Schlecht ist, dass er immer dort aufgerufen werden kann, wo die Sprache das vorsieht, und nicht nur an den Stellen, an die der Programmierer denkt, wenn er diesen Operator einführt. Ein Konvertierungsoperator, der in einen primitiven Typ konvertiert, macht alle Operationen, die für diesen primitiven Typ schon eingebaut sind, auch dem ursprünglichen Typ zugänglich. Das muss sehr schnell zu Mehrdeutigkeiten (im besten Falle) oder zu stillen Bedeutungsänderungen führen. Viele Konstrukte, die eigentlich falsch sind und diagnostiziert werden sollten, können so auf Umwegen doch noch legal werden.<br />
In deinem Beispiel sollte</p>
<pre><code class="language-cpp">if(tier == p)
</code></pre>
<p>natürlich den selbstdefinierten Vergleichsoperator benutzen. Tatsächlich funktioniert das aber auch dann noch, wenn du gar keinen Vergleichsoperator definierst. Die Bedeutung des Ausdrucks tier==p hängt also nicht bloß von den Dingen, die explizit dastehen (also den Operanden und deren Typen und dem Vergleichsoperator) ab, sondern noch von etwas, was gar nicht dasteht, nähmlich ob und, wenn ja, welche Konvertierungsoperatoren/-konstruktoren definiert wurden. Das macht so einen einfachen Ausdruck kompliziert und das ist <em>per se</em> schlecht. Wie soll das erst werden, wenn wir etwas haben, was an sich schon sehr komplex ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191182</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 13 Dec 2006 12:52:47 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Wed, 13 Dec 2006 13:07:32 GMT]]></title><description><![CDATA[<p>Hm, ich erkenne immer noch keinen Nachteil... Aber nicht, dass ihr mich falsch versteht, ich habe keine besonderen Argumente <em>für</em> einen Konv.Op., mch interessiert das halt nur weil ich selber solche Klassen hab...<br />
Bei einem char*-Op versteh ich das ja, dass da was falsch laufen kann, aber ein const char* darf man halt nicht verändern, also weiß ich nicht, was da in die Hose gehen sollte...<br />
Jetzt am Beispiel der String-Klasse: Die Klasse ist ja nur ein Wrapper für den Typ char*, da die Daten an sich aber nur von der Klasse selber verändert werden dürfen (OOP halt), kann man eben nur einen const char* bekommen.<br />
Wenn man einer Variable der Klasse an eine Funktion übergibt, die einen const char* erwartet, dann ist es doch gut so, die Funktion kann ja nix falsches mit anstellen.</p>
<p>Habt ihr vielleicht ein (mehr oder weniger) konkretes Beispiel, wie es &quot;gefährlich&quot; werden könnte, bzw halt nicht im Sinne des Benutzers?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191189</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 13 Dec 2006 13:07:32 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Wed, 13 Dec 2006 13:15:03 GMT]]></title><description><![CDATA[<p>Gefährlich für den Benutzer kann es werden, wenn du beispielsweise den operator== vergisst. Bei einer &quot;normalen&quot; Klasse dürfte der Compiler sich beschweren, wenn du da zwei Objekte vergleichen willst, mit deinem Konversions-Operator bekommst du einfach Müll (char*-Vegleiche arbeiten auf den Adressen, für deine String-Klasse benötigst du vermutlich einen Inhalts-Vegleich). Und noch schlimmer wird das bei gemischten Objekten:</p>
<pre><code class="language-cpp">class string
{
public:
  string(const char*);
  operator const char*() const;
  friend operator==(const string&amp; l, const string&amp; r);
}

string ob1;
char ob2[20];
if(ob1==ob2)...
//soll ich ob1 per operator char* umwandeln und den eingebauten char* Vergleich durchführen?
//oder soll ich ob2 per Ctor in einen string umwandeln und obigen op== verwenden?
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1191194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191194</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 13 Dec 2006 13:15:03 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Wed, 13 Dec 2006 13:27:46 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class string
{
public:
  string(const char*);
  operator const char*() const;
  friend operator==(const string&amp; l, const char* r);
}

string ob1;
char ob2[20];

if(ob1==ob2)...

string ob3
if (ob1==ob3) ...
</code></pre>
<p>Wenn ich Compiler wäre, würde ich sowohl ob2 als auch ob3 in const char* umwandeln, dann müsste es ja funktionieren...<br />
Der Compiler müsste ja alle in Frage kommenden Vergleichsobjekte (also char* char[], const char*, const char[]) in const char* umwandeln können und damit den Vergleichsoperator aufrufen können.<br />
<em>Würde</em> auch funktionieren, <em>wenn es nicht</em> den eingebauten char* == char* Operator geben würde^^</p>
<p>Oder hab ich da was falsch verstanden? Jedenfalls kommt es mir so vor, als würde es komplett ohne casten gehen..??.?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191206</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 13 Dec 2006 13:27:46 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Wed, 13 Dec 2006 13:40:00 GMT]]></title><description><![CDATA[<p>Das Problem ist das man sehr schnell Fehler macht, weil man die ganzen Möglichkeiten die sich, aufgrund impliziter Konvertierung, ergeben garnicht überblicken kann. Die Anzahl der Möglichkeiten ist bei konstanten Typen geringer, es existieren aber immer noch genug die dumme Fehlerquellen sind. Das schlimme ist die Fehlersuche, du wirst bei einem großen Projekt fluchen wenn du so einen Fehler suchen musst und Tage deines Lebens verschwendest diesen zu finden!</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191214</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 13 Dec 2006 13:40:00 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Wed, 13 Dec 2006 22:50:13 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn ich Compiler wäre, würde ich sowohl ob2 als auch ob3 in const char* umwandeln, dann müsste es ja funktionieren...</p>
</blockquote>
<p>Ja, denke ich auch. (Allerdings betrachte ich den operator == (string&amp;, string&amp;) als den für die Klasse typischen Operator und den<br />
operator == (string&amp;, char*) als sekundäre Anpassung an externe char*'s.)</p>
<blockquote>
<p><em>Würde</em> auch funktionieren, <em>wenn es nicht</em> den eingebauten char* == char* Operator geben würde^^</p>
<p>Oder hab ich da was falsch verstanden?</p>
</blockquote>
<p>Beim dem Satz oben bekomme ich schon den Eindruck, dass Du vielleicht etwas falsch verstanden hast. Der eingebaute operator == (char*, char*) ist ja das, was in den diskutierten Situationen immer vermieden werden muss. Ich weiss nicht ob Du string und char* zu sehr vermischt. Du hattest da einige nicht ganz richtigen Formulierungen wie:</p>
<blockquote>
<p>Schließlich besteht die Klasse nur aus einem char*, ...</p>
</blockquote>
<p>Für den string-vergleich spielt es in der Tat keine so grosse Rolle, dass die Klasse auch noch andere Elemente enthält.</p>
<p>In meinen Beispielen habe ich statt des notwendigen Codes für den Vergleich immer nur return 0/1 geschrieben, nur um etwas kompilierbares zu haben. Ich hoffe, das hat niemanden verwirrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191474</guid><dc:creator><![CDATA[hgf]]></dc:creator><pubDate>Wed, 13 Dec 2006 22:50:13 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Wed, 13 Dec 2006 23:32:07 GMT]]></title><description><![CDATA[<p>hgf schrieb:</p>
<blockquote>
<p>In meinen Beispielen habe ich statt des notwendigen Codes für den Vergleich immer nur return 0/1 geschrieben, nur um etwas kompilierbares zu haben. Ich hoffe, das hat niemanden verwirrt.</p>
</blockquote>
<p>Glaube nicht, dass du jemanden verwirrt hast <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>hgf schrieb:</p>
<blockquote>
<p>Allerdings betrachte ich den operator == (string&amp;, string&amp;) als den für die Klasse typischen Operator [...]</p>
</blockquote>
<p>Im Prinzip ja, aber IMO bräuchte man als zweiten Parameter ja gar kein string&amp;, wenn der sowieso in ein <em>const char</em>* gecastet wird (werden kann). Deckt man halt ein größeres Feld mit dem Operator ab <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>hgf schrieb:</p>
<blockquote>
<p>Für den string-vergleich spielt es in der Tat keine so grosse Rolle, dass die Klasse auch noch andere Elemente enthält.</p>
</blockquote>
<p>Ich dachte immer, der Compiler benutzt die eingebauten Operatoren, wenn die Klasse nur aus einem Typ besteht...?</p>
<p>hgf schrieb:</p>
<blockquote>
<p>Der eingebaute operator == (char*, char*) ist ja das, was in den diskutierten Situationen immer vermieden werden muss.</p>
</blockquote>
<p>Das wollte ich ja auch gar nicht! Mir ging es ja nur um den Operator <strong>const</strong> char*. Also auch operator== (const char*, const char*). Gilt da das auch noch mit dem Vermeiden? Wenn ja, warum?</p>
<p>PS: Danke für die Antwort <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/1191482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191482</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 13 Dec 2006 23:32:07 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Thu, 14 Dec 2006 06:08:15 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Das wollte ich ja auch gar nicht! Mir ging es ja nur um den Operator <strong>const</strong> char*. Also auch operator== (const char*, const char*). Gilt da das auch noch mit dem Vermeiden? Wenn ja, warum?</p>
</blockquote>
<p>Weil auch dieser nur Zeiger vergleicht, und nicht Inhalte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191499</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 14 Dec 2006 06:08:15 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Thu, 14 Dec 2006 07:10:25 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>hgf schrieb:</p>
<blockquote>
<p>Allerdings betrachte ich den operator == (string&amp;, string&amp;) als den für die Klasse typischen Operator [...]</p>
</blockquote>
<p>Im Prinzip ja, aber IMO bräuchte man als zweiten Parameter ja gar kein string&amp;, wenn der sowieso in ein <em>const char</em>* gecastet wird (werden kann). Deckt man halt ein größeres Feld mit dem Operator ab <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>Nein, eine String-Klasse hat üblicherweise auch einen Ctor, der (const) char* entgegennimmt - und dann ist es letztlich egal, ob die Umwandlung von char* nach string bei der Parameter-Übergabe passiert oder im Inneren des op==.</p>
<blockquote>
<p>hgf schrieb:</p>
<blockquote>
<p>Für den string-vergleich spielt es in der Tat keine so grosse Rolle, dass die Klasse auch noch andere Elemente enthält.</p>
</blockquote>
<p>Ich dachte immer, der Compiler benutzt die eingebauten Operatoren, wenn die Klasse nur aus einem Typ besteht...?</p>
</blockquote>
<p>Falsch gedacht. Der Compiler benutzt die eingebauten Operatoren immer, wenn er in der Lage ist, deine Klasse in einen Build-in Typ umzuwandeln (und nichts &quot;besseres&quot; zur Verfügung steht). Sprich: Sobald deine Klasse 'string' einen op char* anbietet, denkt er zumindest darüber nach, die Vergleiche auf char*-Ebene durchzuführen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191503</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 14 Dec 2006 07:10:25 GMT</pubDate></item><item><title><![CDATA[Reply to conversion operator erzeugt zuviele Interpretationen von operator == on Thu, 14 Dec 2006 10:21:10 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Badestrand schrieb:</p>
<blockquote>
<p>Das wollte ich ja auch gar nicht! Mir ging es ja nur um den Operator <strong>const</strong> char*. Also auch operator== (const char*, const char*). Gilt da das auch noch mit dem Vermeiden? Wenn ja, warum?</p>
</blockquote>
<p>Weil auch dieser nur Zeiger vergleicht, und nicht Inhalte.</p>
</blockquote>
<p>Wenn ich den Operator überschreibe (bzw halt op== string&amp;, const char*), vergleicht er ja eben nicht mehr die Zeiger. Sonst bräuchte ich den Operator ja nicht...</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Nein, eine String-Klasse hat üblicherweise auch einen Ctor, der (const) char* entgegennimmt - und dann ist es letztlich egal, ob die Umwandlung von char* nach string bei der Parameter-Übergabe passiert oder im Inneren des op==.</p>
</blockquote>
<p>Achso, na gut... Aber verbraucht die Umwandlung in ein (bzw Erstellung eines) string-Objekt(es) dann nicht mehr Laufzeit als ein Cast? Den Cast könnte man ja inlinen, dann muss ja nur das Objekt direkt auf den Stack gepusht werden. Wenn das Objekt erstellt wird, muss es ja auf dem Stack erzeugt werden (was ja nicht viel kostet), aber dann wird der Konstruktor aufgerufen, der String kopiert, übergeben und dann der Destruktur ausgeführt... Das dürfte der Compiler ja eigentlich nicht weg-optimieren.<br />
Und was meinst du mit &quot;<em>Umwandlung [...] im Inneren des op==</em>&quot;? Im Inneren des op musst du ja nicht nach string umwandeln. In dem Fall kann man doch einfach strcmp aufrufen oder eine ähnliche Funktion durchlaufen lassen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Nach wie vor: Ich sehe immer noch keinen Nachteil, in eine String-Klasse den <em>operator const char</em>* zu implementieren :xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191613</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 14 Dec 2006 10:21:10 GMT</pubDate></item></channel></rss>