<?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[Auflösung von Mehrdeutigkeiten]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgendes Problem hier: Ein QString (von QT, Implementation interessiert nicht weiter) soll in einen std::string umgewandelt werden. Der Code der das macht sieht so aus:</p>
<pre><code class="language-cpp">void func( const QString&amp; q) {
  std::string s = q;
}
</code></pre>
<p>Der KAI-Compiler frisst das auch (warum auch immer). Der GNU meckert allerdings (meiner Meinung nach zu Recht), dass er das nicht auflösen kann. Denn:</p>
<pre><code class="language-cpp">class QString
{
  ...
  operator char* ();
  operator std::string ();
}
</code></pre>
<p>und der Konstruktor von std::string kann beides annehmen.</p>
<p>Meine Frage daher: Gibt es irgendeine Regel, nach der ein Konstruktor bevorzugt werden sollte? Oder ist der Fehler vom GNU richtig, dass es so nicht aufgelöst werden kann?<br />
Einer der beiden Compiler macht anscheinend etwas falsch und es geht nun darum, ob der Code angepasst werden muss oder nicht (ist natürlich nicht nur diese 1 beispielhafte Stelle, sondern über ne Menge Module verstreut).</p>
<p>Das hier schluckt übrigens auch der GNU...</p>
<pre><code class="language-cpp">std::string func( const QString&amp; q) {
  return q;
}
</code></pre>
<p>Ich vermute mal, dass er hier über den Return-Typ entscheidet, welchen Cast-Operator er verwenden soll.</p>
<p>Bitte keine Vorschläge á la &quot;gleich operator std::string hinschreiben&quot; (denn das wäre dann die Anpassungsarbeit die anfällt). Es geht mir dadrum, ob es eine Regel im Standard gibt oder nicht.</p>
<p>Noch eine Anmerkung:<br />
Die STL die dem KAI und dem GNU beiliegt, implementieren beide string als basic_string&lt;char&gt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/118969/auflösung-von-mehrdeutigkeiten</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 20:13:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/118969.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 26 Aug 2005 09:28:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Auflösung von Mehrdeutigkeiten on Fri, 26 Aug 2005 09:32:43 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgendes Problem hier: Ein QString (von QT, Implementation interessiert nicht weiter) soll in einen std::string umgewandelt werden. Der Code der das macht sieht so aus:</p>
<pre><code class="language-cpp">void func( const QString&amp; q) {
  std::string s = q;
}
</code></pre>
<p>Der KAI-Compiler frisst das auch (warum auch immer). Der GNU meckert allerdings (meiner Meinung nach zu Recht), dass er das nicht auflösen kann. Denn:</p>
<pre><code class="language-cpp">class QString
{
  ...
  operator char* ();
  operator std::string ();
}
</code></pre>
<p>und der Konstruktor von std::string kann beides annehmen.</p>
<p>Meine Frage daher: Gibt es irgendeine Regel, nach der ein Konstruktor bevorzugt werden sollte? Oder ist der Fehler vom GNU richtig, dass es so nicht aufgelöst werden kann?<br />
Einer der beiden Compiler macht anscheinend etwas falsch und es geht nun darum, ob der Code angepasst werden muss oder nicht (ist natürlich nicht nur diese 1 beispielhafte Stelle, sondern über ne Menge Module verstreut).</p>
<p>Das hier schluckt übrigens auch der GNU...</p>
<pre><code class="language-cpp">std::string func( const QString&amp; q) {
  return q;
}
</code></pre>
<p>Ich vermute mal, dass er hier über den Return-Typ entscheidet, welchen Cast-Operator er verwenden soll.</p>
<p>Bitte keine Vorschläge á la &quot;gleich operator std::string hinschreiben&quot; (denn das wäre dann die Anpassungsarbeit die anfällt). Es geht mir dadrum, ob es eine Regel im Standard gibt oder nicht.</p>
<p>Noch eine Anmerkung:<br />
Die STL die dem KAI und dem GNU beiliegt, implementieren beide string als basic_string&lt;char&gt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/858859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/858859</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Fri, 26 Aug 2005 09:32:43 GMT</pubDate></item><item><title><![CDATA[Reply to Auflösung von Mehrdeutigkeiten on Fri, 26 Aug 2005 09:33:54 GMT]]></title><description><![CDATA[<p>Was sagt denn der Comeau Online Compiler dazu?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/858862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/858862</guid><dc:creator><![CDATA[:o]]></dc:creator><pubDate>Fri, 26 Aug 2005 09:33:54 GMT</pubDate></item><item><title><![CDATA[Reply to Auflösung von Mehrdeutigkeiten on Fri, 26 Aug 2005 10:09:26 GMT]]></title><description><![CDATA[<p>:o schrieb:</p>
<blockquote>
<p>Was sagt denn der Comeau Online Compiler dazu?</p>
</blockquote>
<p>Ich habe 5 Minuten lang aufmerksam mein Ohr an den Monitor gelegt, habe aber nicht gehört, dass der Comeau etwas gesagt hat.</p>
<p>Und beantworten tut es meine eigentliche Frage nicht. Compilieren tut es der Comeau - und er benutzt den operator std::string() (operator std::string private machen gibt nen Compile-Fehler).</p>
<p>Nochmal die Frage: Warum ist das so? Macht der Comeau es denn richtig? Wie lautet die Regel, nach der gewählt wird?</p>
<p>Den Code hier hab ich zum Testen durch den Comeau gejagt:</p>
<pre><code class="language-cpp">#include &lt;string&gt;

class qstr
{
public:
  operator char*() const { return 0; }
  operator std::string() const { return std::string(); }
};

void f( const qstr&amp; q)
{
  std::string s( q);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/858885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/858885</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Fri, 26 Aug 2005 10:09:26 GMT</pubDate></item><item><title><![CDATA[Reply to Auflösung von Mehrdeutigkeiten on Fri, 26 Aug 2005 13:35:10 GMT]]></title><description><![CDATA[<p>@7H3 N4C3R<br />
Das der Comeau deinen Beispielcode übersetzt ist klar. Du hast zwei mögliche Konverierungen. Einmal nach char* und einmal nach std::string. std::string kann u.A. mit einen <strong>const</strong> char* und einem std::string erzeugt werden. D.h. die erste Version benötigt eine cv-Conversion. Die zweie Version ist ein exact match, welche nach C++ Auflösungsregeln bevorzugt wird.</p>
<p>Ändern wir nun:</p>
<pre><code class="language-cpp">class qstr
{
public:
  operator char*() const { return 0; }
  operator std::string() const { return std::string(); }
};
</code></pre>
<p>in</p>
<pre><code class="language-cpp">class qstr
{
public:
  operator const char*() const { return 0; }
  operator std::string() const { return std::string(); }
};
</code></pre>
<p>dann ist</p>
<pre><code class="language-cpp">std::string s(q);
</code></pre>
<p>mehrdeutig, da beide Konvertierungen ein exact match sind.</p>
<p>Schreibst du hingegen:</p>
<pre><code class="language-cpp">std::string s = q;
</code></pre>
<p>dann machst du aus der &quot;direct intialization&quot; eine &quot;copy-initialization&quot; (siehe 8.5 und <a href="http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&amp;faq=copyvsdirect#Answ" rel="nofollow">http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&amp;faq=copyvsdirect#Answ</a>)</p>
<p>Bei der Copy-Initialisierung eines Typs T mit einem Objekt vom Typ S werden von S nur die Konvertierungsoperatoren berücksichtigt (laut 13.3.1.4), die ein T liefern. Demzufolge wird von q nur der op std::string berücksichtigt.<br />
Du hast also nur eine mögliche Konvertierung und damit natürlich keine Mehrdeutigkeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/859039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/859039</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Fri, 26 Aug 2005 13:35:10 GMT</pubDate></item><item><title><![CDATA[Reply to Auflösung von Mehrdeutigkeiten on Fri, 26 Aug 2005 14:00:11 GMT]]></title><description><![CDATA[<p>Ups, ich meinte natürlich const char*. Und stimmt, dann haut es mir auch der Comeau um die Ohren.</p>
<p>Die Regel mit der Copy-Initialization kannte ich allerdings noch nicht - ist aber gut zu wissen. Ansonsten wäre der QT-Code an der Stelle auch irgendwie schwachsinnig <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>Dankeschön!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/859060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/859060</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Fri, 26 Aug 2005 14:00:11 GMT</pubDate></item><item><title><![CDATA[Reply to Auflösung von Mehrdeutigkeiten on Mon, 29 Aug 2005 15:53:48 GMT]]></title><description><![CDATA[<p><a href="http://groups.google.de/group/comp.lang.c++.moderated/browse_frm/thread/b073c593e080aba3/a1c8bc6ab686e18d?q=Difficulties+with+overload+resolution&amp;rnum=1&amp;hl=de#a1c8bc6ab686e18d" rel="nofollow">ISo ein Zufall</a>.</p>
<p>Nun ist es amtlich: <a href="http://c++.de" rel="nofollow">c++.de</a>'ler wissen früher bescheid <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/860784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860784</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Mon, 29 Aug 2005 15:53:48 GMT</pubDate></item><item><title><![CDATA[Reply to Auflösung von Mehrdeutigkeiten on Mon, 29 Aug 2005 17:20:19 GMT]]></title><description><![CDATA[<p><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="😃"
    /> Japps das stimmt! <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>
<p>Ich war jung und ich brauchte die Lösung <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>
]]></description><link>https://www.c-plusplus.net/forum/post/860835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/860835</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 29 Aug 2005 17:20:19 GMT</pubDate></item></channel></rss>