<?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[Unklarheit: Implizite Typumwandlung im Konstruktor schlägt fehl]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>folgendes kleines Beispielprogramm lässt sich problemlos kompilieren. Die Struktur A bekommt im Konstruktor einen numerischen Wert übergeben, die Struktur B eine konstante Referenz auf eine Instanz von A. In der Rahmenfunktion main zeigt sich bei B(10); wie erwartet, dass implizit eine Instanz von A erzeugt wird. ...</p>
<pre><code class="language-cpp">struct A {
        A(int) {};
};

struct B {
        B(const A&amp;) {};
};

int main()
{
        A(10);
        B(10);
}
</code></pre>
<p>Wird nun der Typ (int) von dem Parameter des Konstruktors der ersten Struktur A durch eine konstante Referenz auf einen String (const std::string&amp;) ersetzt und in der Hauptfunktion eine Zeichenkette übergeben, so lässt sich das Beispiel nicht mehr erfolgreich kompilieren:</p>
<pre><code class="language-cpp">// ...
        A(const string &amp;) {};
// ...
        A(&quot;No one fucks with Tux ...&quot;);
        B(&quot;... Linux the OS for the truly hardcore!&quot;);
</code></pre>
<p>Übersetzungsvorgang schrieb:</p>
<blockquote>
<p># g++ main.cpp<br />
main.cpp: In function 'int main()':<br />
main.cpp:15: error: no matching function for call to 'B::B(const char [41])'<br />
main.cpp:9: note: candidates are: B::B(const A&amp;)<br />
main.cpp:8: note: B::B(const B&amp;)</p>
</blockquote>
<p>Kann mir jemand erklären, woran das liegt? - ich stehe im Moment ein wenig auf dem Schlauch.</p>
<p>Vermutung 1:</p>
<p>Der Konstruktor von basic_string ist als explicit deklariert. Vgl. basic_string.h.</p>
<pre><code class="language-cpp">explicit
      basic_string(const _Alloc&amp; __a);
</code></pre>
<p>Vermutung 2:</p>
<p>Liegt das einfach an der Tatsache, dass std::basic_string eine Klasse ist und int ein elementarer Typ? Wenn ja, wodurch lässt sich dieses Verhalten dann genau begründen?</p>
<p>Ich bin um jede Hilfe (gerne auch Vermutungen <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="🙂"
    /> dankbar<br />
Grüße Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/180794/unklarheit-implizite-typumwandlung-im-konstruktor-schlägt-fehl</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 23:29:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180794.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 06 May 2007 18:10:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unklarheit: Implizite Typumwandlung im Konstruktor schlägt fehl on Sun, 06 May 2007 18:10:21 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>folgendes kleines Beispielprogramm lässt sich problemlos kompilieren. Die Struktur A bekommt im Konstruktor einen numerischen Wert übergeben, die Struktur B eine konstante Referenz auf eine Instanz von A. In der Rahmenfunktion main zeigt sich bei B(10); wie erwartet, dass implizit eine Instanz von A erzeugt wird. ...</p>
<pre><code class="language-cpp">struct A {
        A(int) {};
};

struct B {
        B(const A&amp;) {};
};

int main()
{
        A(10);
        B(10);
}
</code></pre>
<p>Wird nun der Typ (int) von dem Parameter des Konstruktors der ersten Struktur A durch eine konstante Referenz auf einen String (const std::string&amp;) ersetzt und in der Hauptfunktion eine Zeichenkette übergeben, so lässt sich das Beispiel nicht mehr erfolgreich kompilieren:</p>
<pre><code class="language-cpp">// ...
        A(const string &amp;) {};
// ...
        A(&quot;No one fucks with Tux ...&quot;);
        B(&quot;... Linux the OS for the truly hardcore!&quot;);
</code></pre>
<p>Übersetzungsvorgang schrieb:</p>
<blockquote>
<p># g++ main.cpp<br />
main.cpp: In function 'int main()':<br />
main.cpp:15: error: no matching function for call to 'B::B(const char [41])'<br />
main.cpp:9: note: candidates are: B::B(const A&amp;)<br />
main.cpp:8: note: B::B(const B&amp;)</p>
</blockquote>
<p>Kann mir jemand erklären, woran das liegt? - ich stehe im Moment ein wenig auf dem Schlauch.</p>
<p>Vermutung 1:</p>
<p>Der Konstruktor von basic_string ist als explicit deklariert. Vgl. basic_string.h.</p>
<pre><code class="language-cpp">explicit
      basic_string(const _Alloc&amp; __a);
</code></pre>
<p>Vermutung 2:</p>
<p>Liegt das einfach an der Tatsache, dass std::basic_string eine Klasse ist und int ein elementarer Typ? Wenn ja, wodurch lässt sich dieses Verhalten dann genau begründen?</p>
<p>Ich bin um jede Hilfe (gerne auch Vermutungen <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="🙂"
    /> dankbar<br />
Grüße Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279846</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 06 May 2007 18:10:21 GMT</pubDate></item><item><title><![CDATA[Reply to Unklarheit: Implizite Typumwandlung im Konstruktor schlägt fehl on Sun, 06 May 2007 18:32:58 GMT]]></title><description><![CDATA[<p>Hmm, ich kann Dir auf die primäre Frage keine Antwort geben, aber am explicit und daran, daß String eine Klasse ist liegt es nicht.<br />
Folgendes geht nämlich:</p>
<pre><code class="language-cpp">class C 
{
  public:
  explicit C(int a){};
};

class A
{
  public:
  A(const C&amp; c){ };
};

class B
{
  public:
  B(const A&amp; a) { };
};

int main()
{
  A aa(C(10));

  B bb(C(10));

  return 0;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1279863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279863</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sun, 06 May 2007 18:32:58 GMT</pubDate></item><item><title><![CDATA[Reply to Unklarheit: Implizite Typumwandlung im Konstruktor schlägt fehl on Sun, 06 May 2007 18:43:07 GMT]]></title><description><![CDATA[<p>Hmm, scheint am Konvertierungskosntruktor char* -&gt; String zu liegen.</p>
<p>So geht es nämlich:</p>
<pre><code class="language-cpp">int main()
{
  string test = &quot;Dies ist ein Test&quot;;
  A aa(test);

  B bb(test);

  return 0;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1279881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279881</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sun, 06 May 2007 18:43:07 GMT</pubDate></item><item><title><![CDATA[Reply to Unklarheit: Implizite Typumwandlung im Konstruktor schlägt fehl on Sun, 06 May 2007 18:50:04 GMT]]></title><description><![CDATA[<p>Vielen Dank Tachyon, für die rasche Antwort. Ich glaube du hast mich ein wenig missverstanden. <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="🙂"
    /> Mir geht es um die implizite Typumwandlung. Wenn ich im obigen Beispiel B(A(10)); schreibe, so lässt sich auch dieses Programm ohne Probleme übersetzen.</p>
<p>Nach einigen weiteren Versuchen bin ich zu folgendem Ergebnis gekommen: Es liegt an dem Modifizierer explicit.</p>
<pre><code class="language-cpp">struct A {
        A(int) {};
};

struct B {
        B(const A&amp;) {};
};

int main()
{
        A(10);
        B(10);
}
</code></pre>
<p>Dies kompiliert ohne Probleme, wo hingegen folgendes nicht funktioniert:</p>
<pre><code class="language-cpp">struct A {
        explicit A(int) {}; // hier ist das explicit dazugekommen
};

struct B {
        B(const A&amp;) {};
};

int main()
{
        A(10);
        B(10);
}
</code></pre>
<blockquote>
<p># g++ main.cpp<br />
main.cpp: In function 'int main()':<br />
main.cpp:15: error: no matching function for call to 'B::B(int)'<br />
main.cpp:9: note: candidates are: B::B(const A&amp;)<br />
main.cpp:8: note: B::B(const B&amp;)</p>
</blockquote>
<p>Dennoch besten Dank für die Antwort und einen schönen Sonntag Abend.<br />
Grüße Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279884</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 06 May 2007 18:50:04 GMT</pubDate></item><item><title><![CDATA[Reply to Unklarheit: Implizite Typumwandlung im Konstruktor schlägt fehl on Sun, 06 May 2007 18:55:31 GMT]]></title><description><![CDATA[<p>Tachyon hat afaik Recht...</p>
<p>Im ersten Beispiel muss er nur eine implizite Umwandlung machen,<br />
im zweiten Beispiel muss er zwei machen, was er nicht implizit kann...</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279887</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 06 May 2007 18:55:31 GMT</pubDate></item><item><title><![CDATA[Reply to Unklarheit: Implizite Typumwandlung im Konstruktor schlägt fehl on Sun, 06 May 2007 18:55:32 GMT]]></title><description><![CDATA[<p>Stimmt, ich habs mal wieder verpeilt. Eigentlich war die Frage klar...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279888</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sun, 06 May 2007 18:55:32 GMT</pubDate></item><item><title><![CDATA[Reply to Unklarheit: Implizite Typumwandlung im Konstruktor schlägt fehl on Sun, 06 May 2007 18:55:43 GMT]]></title><description><![CDATA[<p>der Aufruf</p>
<pre><code class="language-cpp">B(&quot;... Linux the OS for the truly hardcore!&quot;);
</code></pre>
<p>würde zwei selbstdefinierte Konvertierungen erfordern, in einer Konvertierungssequenz ist aber immer höchtens eine selbstdefinierte Konvertierungsfunktion (Konstruktor oder operator) zulässig. Der Konstruktor von B benötigt ein A als Argument, A hat aber selbst keinen Konstruktor, der eine Zeichenkette erwartet. Erst die Umwandlung in einen String könnte zur Erstellung eines A führen, und das ist nicht erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279889</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 06 May 2007 18:55:43 GMT</pubDate></item><item><title><![CDATA[Reply to Unklarheit: Implizite Typumwandlung im Konstruktor schlägt fehl on Sun, 06 May 2007 19:01:31 GMT]]></title><description><![CDATA[<p>Es liegt daran, das es nur erlaubt ist eine Umwandlungsfunktion aufzurufen.<br />
Bei deinem Beispiel siehts so aus:</p>
<p>1. char* to string mit string(const char* )<br />
2. string to A mit A(const string&amp; ) // zuviel<br />
3. A to B mit B(const A&amp; )</p>
<p>Edit: Musste lange überlegen, wie das nochmal war. Habe dazu mal irgendwo was gelesen. Wenn ich nur wüsste wo ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279892</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 06 May 2007 19:01:31 GMT</pubDate></item><item><title><![CDATA[Reply to Unklarheit: Implizite Typumwandlung im Konstruktor schlägt fehl on Sun, 06 May 2007 19:18:05 GMT]]></title><description><![CDATA[<p>Wunderbar, ich glaube nun habe ich verstanden.</p>
<p>Fazit:<br />
Innerhalb eines Konstruktors darf nur _eine_ Umwandlung stattfinden. Ferner kann die Umwandlung durch setzen des Modifizierers &quot;explicit&quot; explizit unterbunden werden.</p>
<p>Auf das obige Beispiel mit den numerischen Werten bezogen: Hier findet nur eine Typumwandlung statt, nämlich von int nach A. Desweiteren wurde die Umwandlung nicht durch explicit unterbunden, sodass das Programm einwandfrei kompiliert wird.<br />
Wird explicit gesetzt, so lässt sich das Programm nicht kompilieren.</p>
<p>Vgl. Beispiel mit Zeichenkette: Hier findet mehr als eine Typumwandlung statt. Zusätzlich ist der Konstruktor in basic_string.h als explicit gekennzeichnet. Beides trägt für unser Beispiel zum Scheitern des Übersetzungsvorgangs bei.</p>
<p>Stimmt das nun so? <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>Grüße Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279900</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 06 May 2007 19:18:05 GMT</pubDate></item><item><title><![CDATA[Reply to Unklarheit: Implizite Typumwandlung im Konstruktor schlägt fehl on Sun, 06 May 2007 19:23:21 GMT]]></title><description><![CDATA[<p>lucky_tux schrieb:</p>
<blockquote>
<p>Zusätzlich ist der Konstruktor in basic_string.h als explicit gekennzeichnet.</p>
</blockquote>
<p>Das wäre allerdings tragisch. selbstverständlich dürfen wir</p>
<pre><code class="language-cpp">std::string foo = &quot;bar&quot;;
</code></pre>
<p>schreiben, da ist nichts explicit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279903</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 06 May 2007 19:23:21 GMT</pubDate></item><item><title><![CDATA[Reply to Unklarheit: Implizite Typumwandlung im Konstruktor schlägt fehl on Sun, 06 May 2007 19:28:57 GMT]]></title><description><![CDATA[<p>Stimmt. Lediglich der Konstruktor von basic_string, welchem eine Referenz auf einen Alocator übergeben wird, ist als extern deklariert. Da habe ich mich ein wenig verguckt. <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/1279906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279906</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 06 May 2007 19:28:57 GMT</pubDate></item></channel></rss>