<?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[friend-injection]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe gerade folgendes gefunden:</p>
<blockquote>
<p>ARM-style name-injection of friend declarations is no longer the default. For example:</p>
<p>struct S {<br />
friend void f();<br />
};</p>
<p>void g() { f(); }</p>
<p>will not be accepted; <strong>instead a declaration of f will need to be present outside of the scope of S</strong>. The new -ffriend-injection option will enable the old behavior.</p>
</blockquote>
<p>Das fette verstehe ich nicht. Was muss ich tun?</p>
<p>Gruß<br />
Boris</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/153398/friend-injection</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 07:28:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/153398.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 16 Jul 2006 12:33:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to friend-injection on Sun, 16 Jul 2006 12:33:33 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe gerade folgendes gefunden:</p>
<blockquote>
<p>ARM-style name-injection of friend declarations is no longer the default. For example:</p>
<p>struct S {<br />
friend void f();<br />
};</p>
<p>void g() { f(); }</p>
<p>will not be accepted; <strong>instead a declaration of f will need to be present outside of the scope of S</strong>. The new -ffriend-injection option will enable the old behavior.</p>
</blockquote>
<p>Das fette verstehe ich nicht. Was muss ich tun?</p>
<p>Gruß<br />
Boris</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1098544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1098544</guid><dc:creator><![CDATA[hjdt]]></dc:creator><pubDate>Sun, 16 Jul 2006 12:33:33 GMT</pubDate></item><item><title><![CDATA[Reply to friend-injection on Sun, 16 Jul 2006 14:06:50 GMT]]></title><description><![CDATA[<p>Hallo,<br />
friend beinhalted immer auch eine Deklaration eines Namens. Eine solche Deklaration kann entweder die erste Deklaration eines Namens sein oder aber eine vorhandene Deklaration wiederholen.<br />
Wenn es die erste Deklaration ist (wie hier), wird der Name immer im über der Klasse liegenden Namensraum (hier der globale) deklariert. Man spricht hier von &quot;friend name injection&quot;. Die Frage ist nun, wie bzw. ob ein solch injizierter Name sichtbar ist. Früher war ein injizierter Name ganz normal sichtbar, deshalb hätte dein Beispiel funktioniert (g kann f verwenden, da ein f im globalen Namensraum existiert). Später hat man aber festgellt, dass dies besonders im Zusammenhang mit Templates problematisch wird -&gt; durch die Instanziierung von Templates werden auf einmal Namen von normalen Funktionen sichtbar.<br />
Aus diesem Grund bleiben injizierte Namen in Standard-C++ unsichtbar und damit nicht über normlen Name-Lookup aufrufbar. Dein Beispiel funktioniert also nicht, da in der Funktion g keine Funktion f bekannt ist.<br />
Die Lösung wäre hier auf eine bereits vorhandene Deklaration zurückzugreifen:</p>
<pre><code class="language-cpp">void f();
struct S {
friend void f(); // Redeklaration von ::f
};

void g() {  
  f(); // ok
}
</code></pre>
<p>PS: Es gibt allerdings noch eine Ausnahme: durch Friend-Deklarationen injizierte Namen können über Argument-Dependent-Name-Lookup gefunden werden.</p>
<p>So würde dein Beispiel also funktionieren:</p>
<pre><code class="language-cpp">struct S {
friend void f(S*);
};

void g() { 
  S* s; 
  f(s); // wird über ADL-gefunden
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1098579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1098579</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sun, 16 Jul 2006 14:06:50 GMT</pubDate></item></channel></rss>