<?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[Template-Friends in Verbindung mit Namensraum und abhängigem Typ]]></title><description><![CDATA[<p>Guten Morgen.</p>
<p>Für alle folgenden Codebeispiele sei diese Vorwärtsdeklaration gegeben:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct MyClass;
</code></pre>
<p>Zuerst der Problemcode. Handelt es sich hier um fehlerhaftes C++? (Dass <code>T</code> beim Aufruf aus den Funktionsargumenten alleine nicht hergeleitet werden kann, ist mir bewusst – darum geht es hier nicht. Der gezeigte Code ist diesbezüglich korrekt).</p>
<pre><code class="language-cpp">// (1)
namespace ns
{
	template &lt;typename T&gt;
	void Function(typename T::MemberType);
}

template &lt;typename T&gt;
struct MyClass
{
	friend void ns::Function&lt;T&gt;(typename T::MemberType);
};
</code></pre>
<p>Ich erhalte beim Kompilieren folgende Fehler:</p>
<blockquote>
<p>error C2770: Ungültige explizite template-Argumente für &quot;void ns::Function(T::MemberType)&quot;.<br />
error C2063: 'ns::Function': Keine Funktion</p>
</blockquote>
<p>Diese beiden Varianten (Änderungen als Kommentar) hingegen kompilieren ohne Probleme, auch wenn ich <code>MyClass</code> mit einem gültigen Typen instanziiere:</p>
<pre><code class="language-cpp">// (2)
// Kein Namensraum
template &lt;typename T&gt;
void Function(typename T::MemberType);

template &lt;typename T&gt;
struct MyClass
{
	// Kein ns::
	friend void Function&lt;T&gt;(typename T::MemberType);
};
</code></pre>
<pre><code class="language-cpp">// (3)
namespace ns
{
	// Kein Parameter mit abhängigem Typen MemberType
	template &lt;typename T&gt;
	void Function();
}

template &lt;typename T&gt;
struct MyClass
{
	friend void ns::Function&lt;T&gt;();
};
</code></pre>
<p>Bei diesem Code hingegen erhalte ich allein durch die Deklarationen noch keine Fehler:</p>
<pre><code class="language-cpp">// (4)
namespace ns
{
	template &lt;typename T&gt;
	void Function(typename T::MemberType);
}

template &lt;typename T&gt;
struct MyClass
{
	// keine explizite Angabe des Parameters T, also nicht ns::Function&lt;T&gt;
	friend void ns::Function(typename T::MemberType);
};
</code></pre>
<p>Erst bei der Template-Instanziierung von <code>MyClass</code> mit dem Code</p>
<pre><code class="language-cpp">struct Test
{
	typedef int MemberType;
};

int main()
{
	MyClass&lt;Test&gt; a;
}
</code></pre>
<p>ergeben sich folgende Compilerfehler:</p>
<blockquote>
<p>error C2785: 'void ns::Function(T::MemberType)' und '&lt;Unbekannt&gt;' haben verschiedene Rückgabetypen<br />
error C2063: 'ns::Function': Keine Funktion</p>
</blockquote>
<p>Was schreibt der C++-Standard hier genau vor? Sofern ich nichts übersehen habe, gibt es laut 14.5.3 und 14.6.5 lediglich Probleme bei der Namensauflösung von nicht vollständig qualifizierten Funktionen, wenn sich diese in einem nicht unmittelbar umgebenden Namensraum befinden. Im Bezug auf <code>friend</code> -Funktionen im Kontext abhängiger Parametertypen habe ich nichts gefunden.</p>
<p>Ich verwende Microsoft Visual Studio 2008, verhält sich dessen Compiler standardkonform?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271085/template-friends-in-verbindung-mit-namensraum-und-abhängigem-typ</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 15:54:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271085.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 Jul 2010 05:15:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Friends in Verbindung mit Namensraum und abhängigem Typ on Fri, 23 Jul 2010 05:15:03 GMT]]></title><description><![CDATA[<p>Guten Morgen.</p>
<p>Für alle folgenden Codebeispiele sei diese Vorwärtsdeklaration gegeben:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct MyClass;
</code></pre>
<p>Zuerst der Problemcode. Handelt es sich hier um fehlerhaftes C++? (Dass <code>T</code> beim Aufruf aus den Funktionsargumenten alleine nicht hergeleitet werden kann, ist mir bewusst – darum geht es hier nicht. Der gezeigte Code ist diesbezüglich korrekt).</p>
<pre><code class="language-cpp">// (1)
namespace ns
{
	template &lt;typename T&gt;
	void Function(typename T::MemberType);
}

template &lt;typename T&gt;
struct MyClass
{
	friend void ns::Function&lt;T&gt;(typename T::MemberType);
};
</code></pre>
<p>Ich erhalte beim Kompilieren folgende Fehler:</p>
<blockquote>
<p>error C2770: Ungültige explizite template-Argumente für &quot;void ns::Function(T::MemberType)&quot;.<br />
error C2063: 'ns::Function': Keine Funktion</p>
</blockquote>
<p>Diese beiden Varianten (Änderungen als Kommentar) hingegen kompilieren ohne Probleme, auch wenn ich <code>MyClass</code> mit einem gültigen Typen instanziiere:</p>
<pre><code class="language-cpp">// (2)
// Kein Namensraum
template &lt;typename T&gt;
void Function(typename T::MemberType);

template &lt;typename T&gt;
struct MyClass
{
	// Kein ns::
	friend void Function&lt;T&gt;(typename T::MemberType);
};
</code></pre>
<pre><code class="language-cpp">// (3)
namespace ns
{
	// Kein Parameter mit abhängigem Typen MemberType
	template &lt;typename T&gt;
	void Function();
}

template &lt;typename T&gt;
struct MyClass
{
	friend void ns::Function&lt;T&gt;();
};
</code></pre>
<p>Bei diesem Code hingegen erhalte ich allein durch die Deklarationen noch keine Fehler:</p>
<pre><code class="language-cpp">// (4)
namespace ns
{
	template &lt;typename T&gt;
	void Function(typename T::MemberType);
}

template &lt;typename T&gt;
struct MyClass
{
	// keine explizite Angabe des Parameters T, also nicht ns::Function&lt;T&gt;
	friend void ns::Function(typename T::MemberType);
};
</code></pre>
<p>Erst bei der Template-Instanziierung von <code>MyClass</code> mit dem Code</p>
<pre><code class="language-cpp">struct Test
{
	typedef int MemberType;
};

int main()
{
	MyClass&lt;Test&gt; a;
}
</code></pre>
<p>ergeben sich folgende Compilerfehler:</p>
<blockquote>
<p>error C2785: 'void ns::Function(T::MemberType)' und '&lt;Unbekannt&gt;' haben verschiedene Rückgabetypen<br />
error C2063: 'ns::Function': Keine Funktion</p>
</blockquote>
<p>Was schreibt der C++-Standard hier genau vor? Sofern ich nichts übersehen habe, gibt es laut 14.5.3 und 14.6.5 lediglich Probleme bei der Namensauflösung von nicht vollständig qualifizierten Funktionen, wenn sich diese in einem nicht unmittelbar umgebenden Namensraum befinden. Im Bezug auf <code>friend</code> -Funktionen im Kontext abhängiger Parametertypen habe ich nichts gefunden.</p>
<p>Ich verwende Microsoft Visual Studio 2008, verhält sich dessen Compiler standardkonform?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930362</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 23 Jul 2010 05:15:03 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Friends in Verbindung mit Namensraum und abhängigem Typ on Fri, 23 Jul 2010 05:33:43 GMT]]></title><description><![CDATA[<p>Ich meine, dass es bei VS2008 ohne SP Probleme bei der Namensauflösung in Verbindung mit Templates gab. Ich finde leider auf die Schnelle keinen Link dazu. Falls Du es noch nicht hast, probiert mal SP1 zu installieren...[t]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930366</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 23 Jul 2010 05:33:43 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Friends in Verbindung mit Namensraum und abhängigem Typ on Fri, 23 Jul 2010 05:36:05 GMT]]></title><description><![CDATA[<p>Das Service Pack 1 hab ich wegen des TR1 bereits installiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930368</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 23 Jul 2010 05:36:05 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Friends in Verbindung mit Namensraum und abhängigem Typ on Fri, 23 Jul 2010 11:18:43 GMT]]></title><description><![CDATA[<p>Der MSVC2010 kann es auch nicht.<br />
Was aber geht:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct MyClass;	

namespace ns
{
    template &lt;typename T&gt;
    void Function(typename T::MemberType);
}

template &lt;typename T&gt;
struct MyClass
{
	template&lt;typename U&gt;
	friend void ns::Function&lt;U&gt;(typename U::MemberType);
};	

struct T
{
	typedef int MemberType;
};

int main()
{
	MyClass&lt;T&gt; x;
}
</code></pre>
<p>Sinds halt ein paar Friends mehr ;o)</p>
<p>was dem ganzen vermutlich ein wenig näher kommt:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
struct MyClass;	

namespace ns
{
    template &lt;typename T&gt;
    void Function(typename T::MemberType)
	{
		;
	}

	template &lt;typename T&gt;
	void FunctionHelper(T)
	{
		Function(typename T::MemberType());
	}
}

template &lt;typename T&gt;
struct MyClass
{
    friend void ns::FunctionHelper&lt;T&gt;(T);
};

struct T
{
	typedef int MemberType;
};

int main()
{
	MyClass&lt;T&gt; x;
}
</code></pre>
<p>Was aber den Nachteil hat, dass die Parameter-Liste von Function unter Umständen ziemlich lang werden kann - je nach dem, was du dort machen willst... ^^</p>
<p>Ansonsten scheint es so, als ob es zwar korrektes C++ wäre, aber der MSVC es einfach nicht kann.</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930535</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 23 Jul 2010 11:18:43 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Friends in Verbindung mit Namensraum und abhängigem Typ on Fri, 23 Jul 2010 12:45:52 GMT]]></title><description><![CDATA[<p>Sollte eigentlich korrekt sein.</p>
<p>Comeau, Codepad und gcc schlucken den Code auch (die erste Version). Aber VS kommt damit tatsächlich nicht klar. Egel welche Version...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930643</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 23 Jul 2010 12:45:52 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Friends in Verbindung mit Namensraum und abhängigem Typ on Fri, 23 Jul 2010 15:14:22 GMT]]></title><description><![CDATA[<p>Danke für die Antworten und besonders das Testen auf anderen Compilern! Es scheint sich also wirklich um einen Bug des Microsoft-Compilers zu handeln. Falls noch jemand eine Idee hat oder mehr über den C++-Standard in diesem Punkt weiss, wäre ich froh um weitere Meinungen!</p>
<p>Als Workaround ist es wohl das Einfachste, eine Klasse als <code>friend</code> zu machen und <code>static</code> -Methoden anzubieten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930764</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 23 Jul 2010 15:14:22 GMT</pubDate></item></channel></rss>