<?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[Implizite Konvertierungen (Split aus &amp;quot;Operatoren für eigene Double Klasse&amp;quot;)]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Oder wieso eine Klasse schreiben, die sich fast genau gleich wie der eingebaute Typ verhält?</p>
</blockquote>
<p>Schlimmer noch: wenn beide Konvertierungen (hin und zurück) möglich sind, wird sich ein double nicht mehr wie sonst verhalten - weil in den unmöglichsten Gelegenheiten der Compiler plötzlich auf die Idee kommen kann, ein double klammheimlich implizit hin und zurück zu konvertieren um Code zu kompilieren, der z.B. wegen eines Flüchtigkeitsfehlers nicht kompilieren sollte.</p>
</blockquote>
<p>IIRC sind mehrere implizite userdefinierte Konvertierungen &quot;am Stück&quot; nicht erlaubt, bzw. der Compiler sucht einfach nicht danach.</p>
<p>Ansonsten... kannst du ein Beispiel geben? Würde mich interessieren was du da jetzt meinst.</p>
<p>EDIT: ROFL, hatte den falschen Beitrag zitiert -&gt; korrigiert</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/280580/implizite-konvertierungen-split-aus-quot-operatoren-für-eigene-double-klasse-quot</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 02:04:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/280580.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 17 Jan 2011 17:50:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Implizite Konvertierungen (Split aus &amp;quot;Operatoren für eigene Double Klasse&amp;quot;) on Mon, 17 Jan 2011 17:56:03 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Oder wieso eine Klasse schreiben, die sich fast genau gleich wie der eingebaute Typ verhält?</p>
</blockquote>
<p>Schlimmer noch: wenn beide Konvertierungen (hin und zurück) möglich sind, wird sich ein double nicht mehr wie sonst verhalten - weil in den unmöglichsten Gelegenheiten der Compiler plötzlich auf die Idee kommen kann, ein double klammheimlich implizit hin und zurück zu konvertieren um Code zu kompilieren, der z.B. wegen eines Flüchtigkeitsfehlers nicht kompilieren sollte.</p>
</blockquote>
<p>IIRC sind mehrere implizite userdefinierte Konvertierungen &quot;am Stück&quot; nicht erlaubt, bzw. der Compiler sucht einfach nicht danach.</p>
<p>Ansonsten... kannst du ein Beispiel geben? Würde mich interessieren was du da jetzt meinst.</p>
<p>EDIT: ROFL, hatte den falschen Beitrag zitiert -&gt; korrigiert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007881</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 17 Jan 2011 17:56:03 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierungen (Split aus &amp;quot;Operatoren für eigene Double Klasse&amp;quot;) on Mon, 17 Jan 2011 18:51:00 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>IIRC sind mehrere implizite userdefinierte Konvertierungen &quot;am Stück&quot; nicht erlaubt, bzw. der Compiler sucht einfach nicht danach.</p>
</blockquote>
<p>Sollte schon gehen. Hat man häufiger, als man denkt:</p>
<pre><code class="language-cpp">struct MyClass
{
	MyClass(std::string s);
};

MyClass a(&quot;hallo&quot;);
</code></pre>
<p>Es geht sogar hin und zurück zum ursprünglichen Typen. Das wird bei <code>std::auto_ptr</code> (und <code>std::auto_ptr_ref</code> ) ausgenutzt, um Move-Semantik über Parameter und Rückgabewerte hinweg zu ermöglichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007925</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 17 Jan 2011 18:51:00 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierungen (Split aus &amp;quot;Operatoren für eigene Double Klasse&amp;quot;) on Mon, 17 Jan 2011 19:27:24 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>IIRC sind mehrere implizite userdefinierte Konvertierungen &quot;am Stück&quot; nicht erlaubt, bzw. der Compiler sucht einfach nicht danach.</p>
</blockquote>
<p>Sollte schon gehen. Hat man häufiger, als man denkt:</p>
<pre><code class="language-cpp">struct MyClass
{
	MyClass(std::string s);
};

MyClass a(&quot;hallo&quot;);
</code></pre>
</blockquote>
<p>Hier erfolgt nur eine userdefinierte implizite Konvertierung (char const [N] -&gt; string), die zweite ist explizit (string -&gt; myclass).</p>
<p>Probier mal das, das geht nämlich nimmer:</p>
<pre><code class="language-cpp">struct MyClass
	{
		MyClass(std::string s);
	};

	void foo(MyClass mc)
	{
	}

	void bar()
	{
		foo(&quot;sepp&quot;); // nix da!
		foo(static_cast&lt;MyClass&gt;(&quot;sepp&quot;)); // geht, da nur eine implizite userdefinierte konvertierung in folge
		foo(static_cast&lt;std::string&gt;(&quot;sepp&quot;)); // geht auch, da auch nur eine implizite userdefinierte konvertierung in folge
	}
</code></pre>
<p>Für <code>foo(&quot;sepp&quot;)</code> wären nämlich zwei implizite userdefinierte Konvertierungen nötig, und das ist wie gesagt nicht erlaubt. Wäre auch totale Katastrophe wenns erlaubt wäre, nicht nur was die Compilezeiten angeht, auch was das &quot;principle of least astonishment&quot; angeht.</p>
<p>(&quot;userdefiniert&quot; schliesst hier natürlich sämtliche Typen der Standard-Library mit ein - nur halt nicht &quot;eingebaute&quot; Konvertierungen wie char -&gt; int oder int -&gt; double -- sollte klar sein)</p>
<blockquote>
<p>Es geht sogar hin und zurück zum ursprünglichen Typen. Das wird bei <code>std::auto_ptr</code> (und <code>std::auto_ptr_ref</code> ) ausgenutzt, um Move-Semantik über Parameter und Rückgabewerte hinweg zu ermöglichen.</p>
</blockquote>
<p>Nönönönönö, da ist auch immer nur eine <em>implizite</em> Konvertierung am Stück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007942</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 17 Jan 2011 19:27:24 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierungen (Split aus &amp;quot;Operatoren für eigene Double Klasse&amp;quot;) on Mon, 17 Jan 2011 20:11:57 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Probier mal das, das geht nämlich nimmer:</p>
</blockquote>
<p>Stimmt. Mein Beispiel war aber auch Schrott. Was ist hier?</p>
<pre><code class="language-cpp">struct MyClass
{
    MyClass(std::string s);
};

int main()
{
    MyClass a = &quot;hallo&quot;;
}
</code></pre>
<p>Ich sehe nämlich keine explizite Konvertierung.</p>
<p>Oder wie siehts hier aus?</p>
<pre><code class="language-cpp">std::auto_ptr&lt;int&gt; Function()
{
	return std::auto_ptr&lt;int&gt;();
}

int main()
{
    std::auto_ptr&lt;int&gt; x = Function();
}
</code></pre>
<p>Zwischendurch wird ein Objekt vom Typ <code>std::auto_ptr_ref&lt;int&gt;</code> erzeugt. Wenn die Konvertierung nicht wäre, würde der Compiler versuchen, den Kopierkonstruktor von <code>std::auto_ptr&lt;int&gt;</code> aufzurufen. Der nimmt jedoch nur eine Non-Const-Referenz, kann also nicht auf temporäre Objekte angewandt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2007978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2007978</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 17 Jan 2011 20:11:57 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierungen (Split aus &amp;quot;Operatoren für eigene Double Klasse&amp;quot;) on Mon, 17 Jan 2011 21:16:24 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Was ist hier?</p>
<pre><code class="language-cpp">struct MyClass
{
    MyClass(std::string s);
};

int main()
{
    MyClass a = &quot;hallo&quot;;
}
</code></pre>
<p>Ich sehe nämlich keine explizite Konvertierung.</p>
</blockquote>
<p>Hier wird versucht, ein Objekt des Typs MyClass zu erstellen. Dafür wird nach einem geeigneten Konstruktor gesucht. Dein Konstruktor nimmt einen std::string entgegen. Also ist std::string der Zieltyp und nicht MyClass. Deshalb gibts auch nur eine implizite Konvertierung, nämlich von const char* nach std::string. Die andere Konvertierung gibst du sozusagen direkt an, indem du durch das Definieren eines neuen MyClass-Objekts einen Konstruktoraufruf forderst und dadurch std::string -&gt; MyClass &quot;konvertiert&quot; werden muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2008013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2008013</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 17 Jan 2011 21:16:24 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierungen (Split aus &amp;quot;Operatoren für eigene Double Klasse&amp;quot;) on Mon, 17 Jan 2011 21:33:02 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Probier mal das, das geht nämlich nimmer:</p>
</blockquote>
<p>Stimmt. Mein Beispiel war aber auch Schrott. Was ist hier?</p>
<pre><code class="language-cpp">struct MyClass
{
    MyClass(std::string s);
};

int main()
{
    MyClass a = &quot;hallo&quot;;
}
</code></pre>
<p>Ich sehe nämlich keine explizite Konvertierung.</p>
</blockquote>
<p>Ich dachte dass das gleichbedeutend ist mit <code>a(&quot;hallo&quot;)</code> . MSVC sieht das auch so wie ich. Comeau sieht es anders, der compiliert das nicht. Muss ich selbst im Standard nachsehen. Wenn es erlaubt ist, dann deswegen, weil im Kontext einer Initialisierung die Schreibweise <code>MyClass a = &quot;hallo&quot;</code> gleichbedeutend ist mit <code>MyClass a(&quot;hallo&quot;)</code> . Bzw. eben nicht, wenn es nicht erlaubt ist <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="🙂"
    /><br />
(d.h. gleichbedeutend mit der Ausnahme, dass der Copy-Ctor &quot;accessible&quot; sein muss)</p>
<blockquote>
<p>Oder wie siehts hier aus?</p>
<pre><code class="language-cpp">std::auto_ptr&lt;int&gt; Function()
{
	return std::auto_ptr&lt;int&gt;();
}

int main()
{
    std::auto_ptr&lt;int&gt; x = Function();
}
</code></pre>
<p>Zwischendurch wird ein Objekt vom Typ <code>std::auto_ptr_ref&lt;int&gt;</code> erzeugt. Wenn die Konvertierung nicht wäre, würde der Compiler versuchen, den Kopierkonstruktor von <code>std::auto_ptr&lt;int&gt;</code> aufzurufen. Der nimmt jedoch nur eine Non-Const-Referenz, kann also nicht auf temporäre Objekte angewandt werden.</p>
</blockquote>
<p>Das ist ein klarer Fall, hier wird nur eine implizite userdefinierte Konvertierung gemacht, und zwar von std::auto_ptr zu std::auto_ptr_ref. Das std::auto_ptr_ref Objekt wird dann direkt vom passenden auto_ptr::operator = (auto_ptr_ref) gefressen (EDIT: bzw. vom passenden ctor - kommt aufs selbe raus - kannst mal den ctor MyDysfunctionalAutoPtr(Ref r) wegmachen und gucken was passiert /EDIT). Ohne den geht's auch nicht:</p>
<pre><code class="language-cpp">struct MyDysfunctionalAutoPtr
{
	struct Ref {};

	MyDysfunctionalAutoPtr() {}
	MyDysfunctionalAutoPtr(MyDysfunctionalAutoPtr&amp; mutableOther) {}
	MyDysfunctionalAutoPtr(Ref r) {}

	MyDysfunctionalAutoPtr&amp; operator = (MyDysfunctionalAutoPtr&amp; mutableOther) { return *this; }

	operator Ref () { return Ref(); }
};

struct MyBetterAutoPtr
{
	struct Ref {};

	MyBetterAutoPtr() {}
	MyBetterAutoPtr(MyBetterAutoPtr&amp; other) {}
	MyBetterAutoPtr(Ref r) {}

	operator Ref () { return Ref(); }

	MyBetterAutoPtr&amp; operator = (MyBetterAutoPtr&amp; mutableOther) { return *this; }
	MyBetterAutoPtr&amp; operator = (Ref r) { return *this; }
};

MyDysfunctionalAutoPtr MachMirEinAuto() { return MyDysfunctionalAutoPtr(); }

MyBetterAutoPtr MachMirEinBesseresAuto() { return MyBetterAutoPtr(); }

int main()
{
	MyDysfunctionalAutoPtr aa(MachMirEinAuto()); // geht
	MyDysfunctionalAutoPtr ab = MachMirEinAuto(); // geht auch
	MyDysfunctionalAutoPtr ac;
	ac = MachMirEinAuto(); // geht nicht, da MyDysfunctionalAutoPtr keinen operator = (Ref) hat,
	                       // und ohne den 2 userdefinierte konvertierungen nötig wären

	MyBetterAutoPtr baa(MachMirEinBesseresAuto()); // geht
	MyBetterAutoPtr bab = MachMirEinBesseresAuto(); // geht auch
	MyBetterAutoPtr bac;
	bac = MachMirEinBesseresAuto();	// geht, da MyBetterAutoPtr einen operator = (Ref) hat

}
</code></pre>
<p>Comeau C/C++ 4.3.10.1 schrieb:</p>
<blockquote>
<pre><code>&quot;ComeauTest.c&quot;, line 37: error: no operator &quot;=&quot; matches these operands
            operand types are: MyDysfunctionalAutoPtr = MyDysfunctionalAutoPtr
  	ac = MachMirEinAuto(); // geht nicht, da MyDysfunctionalAutoPtr keinen operator = (Ref) hat,
  	   ^

1 error detected in the compilation of &quot;ComeauTest.c&quot;.
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2008023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2008023</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 17 Jan 2011 21:33:02 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierungen (Split aus &amp;quot;Operatoren für eigene Double Klasse&amp;quot;) on Mon, 17 Jan 2011 21:51:31 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Die andere Konvertierung gibst du sozusagen direkt an, indem du durch das Definieren eines neuen MyClass-Objekts einen Konstruktoraufruf forderst und dadurch std::string -&gt; MyClass &quot;konvertiert&quot; werden muss.</p>
</blockquote>
<p>Ja, aber die Konvertierung <code>std::string</code> -&gt; <code>MyClass</code> geschieht implizit (schliesslich ist der String kein direktes Konstruktorargument und wird auch nicht gecastet). Da der Konvertierungskonstruktor nicht <code>explicit</code> ist, spielt das aber keine Rolle.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich dachte dass das gleichbedeutend ist mit <code>a(&quot;hallo&quot;)</code> .</p>
</blockquote>
<p>Bei <code>MyClass a = &quot;hallo&quot;;</code> darf der Konstruktor nicht <code>explicit</code> sein. Zudem ist es meines Wissens erlaubt, dass der Compiler vom String ein temporäres Objekt anlegt und dann dieses in das benannte Objekt kopiert.</p>
<p>Es kann aber sein, dass hier MSVC++ nicht ganz so streng ist. Das wäre aber noch gut zu wissen, wenn man portabel programmieren möchte...</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Das ist ein klarer Fall, hier wird nur eine implizite userdefinierte Konvertierung gemacht, und zwar von std::auto_ptr zu std::auto_ptr_ref. Das std::auto_ptr_ref Objekt wird dann direkt vom passenden auto_ptr::operator = (auto_ptr_ref) gefressen</p>
</blockquote>
<p>Du hast Recht. Danke vielmals für die Mühe.</p>
<p>Dabei habe ich selbst einmal einen solchen Smart-Pointer geschrieben, eigentlich sollte ich das wissen <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>
<p><em>@ Student83: Sorry für Offtopic. Jemand ist sicher so nett das abzutrennen <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="🙂"
    /></em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2008037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2008037</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 17 Jan 2011 21:51:31 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierungen (Split aus &amp;quot;Operatoren für eigene Double Klasse&amp;quot;) on Mon, 17 Jan 2011 22:29:26 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Was ist hier?</p>
<pre><code class="language-cpp">struct MyClass
{
    MyClass(std::string s);
};

int main()
{
    MyClass a = &quot;hallo&quot;;
}
</code></pre>
<p>Ich sehe nämlich keine explizite Konvertierung.</p>
</blockquote>
<p>Das funktioniert nicht. Du bräuchtest 2 benutzerdefinierte Konvertierungen hierfür. Eine von char[] nach string und eine von string nach MyClass bevor damit (logisch) der Kopierkonstruktor aufgerufen wird. (Letzteres darf aber wegoptimiert werden. Ggf wird auch einfach ein Move-Constructor benutzt.) Diese Art der Initialisierung (T a=...) nennt sich &quot;Kopierinitialisierung&quot; (copy-initialization) und ist übrigens genau dasselbe, wie die Art von Initialisierung von Funktionsparametern sowie des Rückgabewertes/objekts einer Funktion. Und das hier</p>
<pre><code class="language-cpp">int main()
{
    MyClass a (&quot;hallo&quot;);
}
</code></pre>
<p>ist eine <em>direkte</em> Initialisierung (direct initialization). Hier würde genau eine benutzerdefinierte Konvertierung benutzt (char[]--&gt;string), um den Parameter des Konstruktors zu initialisieren.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2008052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2008052</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 17 Jan 2011 22:29:26 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierungen (Split aus &amp;quot;Operatoren für eigene Double Klasse&amp;quot;) on Mon, 17 Jan 2011 22:19:30 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich dachte dass das gleichbedeutend ist mit <code>a(&quot;hallo&quot;)</code> .</p>
</blockquote>
<p>Bei <code>MyClass a = &quot;hallo&quot;;</code> darf der Konstruktor nicht <code>explicit</code> sein. Zudem ist es meines Wissens erlaubt, dass der Compiler vom String ein temporäres Objekt anlegt und dann dieses in das benannte Objekt kopiert.</p>
<p>Es kann aber sein, dass hier MSVC++ nicht ganz so streng ist. Das wäre aber noch gut zu wissen, wenn man portabel programmieren möchte...</p>
</blockquote>
<p>In meinem Test-Code war auch kein Ctor &quot;explicit&quot;... hm.<br />
Muss ich nochmal probieren.</p>
<p>Ich hatte auch bei MSVC die non-Standard Extensions an (hatte auf die Schnelle kein Projekt parat wo die abgedreht wären bzw. das überhaupt ohne compilieren würde).<br />
Und mit MS-Extensions tut der pöse MSVC ja sogar munter rvalues an mutable Referenzen binden... <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="🙂"
    /><br />
(Daher hab ich meinen AutoPtr Test-Code auch durch den Comeau gejagt)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2008054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2008054</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 17 Jan 2011 22:19:30 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierungen (Split aus &amp;quot;Operatoren für eigene Double Klasse&amp;quot;) on Mon, 17 Jan 2011 22:55:28 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Das funktioniert nicht.</p>
</blockquote>
<p>Okay, dann ist es also definitiv eine Erweiterung von MSVC++. Danke für die klare Antwort.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich hatte auch bei MSVC die non-Standard Extensions an (hatte auf die Schnelle kein Projekt parat wo die abgedreht wären bzw. das überhaupt ohne compilieren würde).<br />
Und mit MS-Extensions tut der pöse MSVC ja sogar munter rvalues an mutable Referenzen binden... <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>Bei den RValues warnt er wenigstens, wenn man es versucht. Aber ich habs nun mit abgeschalteten Erweiterungen versucht, dann wird die Konvertierung tatsächlich als Fehler gewertet. Lustig ist auch, wie oft ich dann ein unerwartetes Dateiende hatte <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>Blöd ist nur, dass man etliche Windows-Header so nicht benutzen kann (wegen $ in Makros etc.)</p>
<p>Da ist mir gleich was anderes aufgefallen: Wie müsste die Deklaration hier richtig aussehen, wenn ich nur dem <code>OtherClass</code> -Template mit gleichem <code>T</code> Freundschaft gewähren will?</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class MyClass
{
    friend class OtherClass&lt;T&gt;;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2008072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2008072</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 17 Jan 2011 22:55:28 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierungen (Split aus &amp;quot;Operatoren für eigene Double Klasse&amp;quot;) on Mon, 17 Jan 2011 23:37:19 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Da ist mir gleich was anderes aufgefallen: Wie müsste die Deklaration hier richtig aussehen, wenn ich nur dem <code>OtherClass</code> -Template mit gleichem <code>T</code> Freundschaft gewähren will?</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class MyClass
{
    friend class OtherClass&lt;T&gt;;
};
</code></pre>
</blockquote>
<p>Keine Ahnung, was der Standard dazu sagt, aber VS 2008 schlluckt das, wenn OtherClass bereits deklariert wurde:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

template&lt;typename T&gt;
struct Foo;           // wichtig!

template&lt;typename T&gt;
class Bar
{
	friend struct Foo&lt;T&gt;;

	static const int value = 42;
};

template&lt;typename T&gt;
struct Foo
{
	template&lt;typename U&gt;
	void foo(const Bar&lt;U&gt;&amp; arg)
	{
		std::cout &lt;&lt; arg.value &lt;&lt; std::endl;
	}
};

int main()
{
	{
		Bar&lt;int&gt; bar;
		Foo&lt;int&gt; foo;
		foo.foo(bar);         // kompiliert
	}
	{
		Bar&lt;int&gt; bar;
		Foo&lt;std::string&gt; foo;
		foo.foo(bar);         // kompiliert nicht: kein Zugriff auf Bar&lt;int&gt;::value
	}
}
</code></pre>
<p>Edit: Laut Standard müsste obiger Code legal sein. Ob die Vorwärtsdeklaration nötig ist, kann ein anderer herausfinden.</p>
<p>Beispiel aus dem Standard (§14.5.3 Absatz 1):</p>
<pre><code class="language-cpp">template&lt;class T&gt; class task;
template&lt;class T&gt; task&lt;T&gt;* preempt(task&lt;T&gt;*);

template&lt;class T&gt; class task {
    ...
    friend class task&lt;int&gt;;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2008082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2008082</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 17 Jan 2011 23:37:19 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierungen (Split aus &amp;quot;Operatoren für eigene Double Klasse&amp;quot;) on Tue, 18 Jan 2011 02:01:05 GMT]]></title><description><![CDATA[<p>Boah, bei Template-Friends muss ich selber immer nachgucken, das merk ich mir einfach nicht.<br />
Und mit nachgucken meine ich so lange gockeln bis ich was finde was <code>compiliert</code> - ob das dann laut Standard OK ist oder nicht ... pfuh <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/2008098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2008098</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 18 Jan 2011 02:01:05 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Konvertierungen (Split aus &amp;quot;Operatoren für eigene Double Klasse&amp;quot;) on Tue, 18 Jan 2011 11:39:44 GMT]]></title><description><![CDATA[<p>Die Vorwärtsdeklaration hatte ich eigentlich auch. Wahrscheinlich lags daran, dass <code>OtherClass</code> im Namensraum eine Ebene höher war. Mit expliziter Namensraum-Qualifizierung beim <code>friend</code> gehts nun...</p>
<p>Aber ja, mit <code>friend</code> s und Templates hatte ich auch schon mühsame Auseinandersetzungen. Gerade bei Funktionen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2008208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2008208</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 18 Jan 2011 11:39:44 GMT</pubDate></item></channel></rss>