<?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[typename vs. T::template nochmal]]></title><description><![CDATA[<p>Hi,</p>
<p>typename sagt, dass der abhängige Name ein Typ ist, gut. Aber irritiert bin ich noch von T::template. Das sagt, dass der abhängige Name ein Template ist, aber mich stört das etwas. Man würde ja sagen:</p>
<pre><code class="language-cpp">T::template C&lt;int&gt; z;  // decreed template (Code von zwei verschiedenen Stackoverflow-Threads)
</code></pre>
<p>in einer Funktion/Klasse/..., die T als Templateparameter erwartet. Es wird also gesagt: C ist ein Template. Also ist der Bezug des template-Schlüsselwortes quasi:</p>
<pre><code class="language-cpp">(T::template C)&lt;int&gt; z; // mir geht es hier nicht um korrekte Syntax, sondern wie gesagt um den Bezug
</code></pre>
<p>Schließlich ist C&lt;int&gt; kein Template, sondern ein Typ.</p>
<p>Wenn ich jetzt aber eine nested Klasse habe:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; 
struct outer 
{ 
	template&lt;typename U&gt; 
	struct inner 
	{ 
	}; 

	template&lt;typename U&gt;
	inner&lt;U&gt; createInner(); 
}; 

template&lt;typename T&gt; 
template&lt;typename U&gt;
typename /* &lt;-- dort! */ outer&lt;T&gt;::inner&lt;U&gt; outer&lt;T&gt;::createInner() 
{ 
	return inner(); 
}
</code></pre>
<p>, so wird <em>dort</em> offensichtlich ein typename verlangt. An dieser Stelle soll ich also inner&lt;U&gt; als Typ klassifizieren, nicht aber inner als Template (was in Codefetzen 1 genau umgekehrt war). Das wirkt für mich inkonsequent, wobei es das mit Sicherheit nicht ist. Welches Detail führt dazu, dass man das hier anders ausweist?</p>
<p>Daran, dass da ein &lt;U&gt; steht, kann es nicht liegen, schließlich ist das in Codefetzen 1 ja auch der Fall. Auch bin ich nicht ganz sicher, welche Irritation für den Compiler man in Codefetzen 1 erledigt, was sollte C denn sein wenn kein Template? Eine Funktion? (ist Funktion ein anderes Tier als Wert/Typ/Template, oder zählt das als Typ? Wenn es als Typ zählt, könnte das doch auch wieder Rückgabe der Methode in Codefetzen 3 sein).</p>
<p>Vielen Dank im Voraus und beste Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317179/typename-vs-t-template-nochmal</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 06:13:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317179.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 May 2013 08:31:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 08:43:20 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>typename sagt, dass der abhängige Name ein Typ ist, gut. Aber irritiert bin ich noch von T::template. Das sagt, dass der abhängige Name ein Template ist, aber mich stört das etwas. Man würde ja sagen:</p>
<pre><code class="language-cpp">T::template C&lt;int&gt; z;  // decreed template (Code von zwei verschiedenen Stackoverflow-Threads)
</code></pre>
<p>in einer Funktion/Klasse/..., die T als Templateparameter erwartet. Es wird also gesagt: C ist ein Template. Also ist der Bezug des template-Schlüsselwortes quasi:</p>
<pre><code class="language-cpp">(T::template C)&lt;int&gt; z; // mir geht es hier nicht um korrekte Syntax, sondern wie gesagt um den Bezug
</code></pre>
<p>Schließlich ist C&lt;int&gt; kein Template, sondern ein Typ.</p>
<p>Wenn ich jetzt aber eine nested Klasse habe:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; 
struct outer 
{ 
	template&lt;typename U&gt; 
	struct inner 
	{ 
	}; 

	template&lt;typename U&gt;
	inner&lt;U&gt; createInner(); 
}; 

template&lt;typename T&gt; 
template&lt;typename U&gt;
typename /* &lt;-- dort! */ outer&lt;T&gt;::inner&lt;U&gt; outer&lt;T&gt;::createInner() 
{ 
	return inner(); 
}
</code></pre>
<p>, so wird <em>dort</em> offensichtlich ein typename verlangt. An dieser Stelle soll ich also inner&lt;U&gt; als Typ klassifizieren, nicht aber inner als Template (was in Codefetzen 1 genau umgekehrt war). Das wirkt für mich inkonsequent, wobei es das mit Sicherheit nicht ist. Welches Detail führt dazu, dass man das hier anders ausweist?</p>
<p>Daran, dass da ein &lt;U&gt; steht, kann es nicht liegen, schließlich ist das in Codefetzen 1 ja auch der Fall. Auch bin ich nicht ganz sicher, welche Irritation für den Compiler man in Codefetzen 1 erledigt, was sollte C denn sein wenn kein Template? Eine Funktion? (ist Funktion ein anderes Tier als Wert/Typ/Template, oder zählt das als Typ? Wenn es als Typ zählt, könnte das doch auch wieder Rückgabe der Methode in Codefetzen 3 sein).</p>
<p>Vielen Dank im Voraus und beste Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327271</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 30 May 2013 08:43:20 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 08:57:30 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>An dieser Stelle soll ich also inner&lt;T&gt; als Typ klassifizieren, nicht aber inner als Template (was in Codefetzen 1 genau umgekehrt war).</p>
</blockquote>
<p>Auch dort ist nat. das Schlüsselwort template erforderlich</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
template&lt;typename U&gt;
typename outer&lt;T&gt;::template inner&lt;U&gt; outer&lt;T&gt;::createInner()
{
    return inner&lt;U&gt;(); 
}
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
template&lt;typename U&gt;
auto outer&lt;T&gt;::createInner() -&gt; inner&lt;U&gt;
{
    return inner&lt;U&gt;(); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2327273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327273</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 30 May 2013 08:57:30 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 09:34:09 GMT]]></title><description><![CDATA[<p>Ist das dann MSVC10s Fehler? Das (Variante 1 mit ::template) habe ich nämlich auch probiert, weil es mir sinnvoll erschien und dann:</p>
<blockquote>
<p>error C2244: 'outer&lt;T&gt;::createInner': Keine Übereinstimmung für Funktionsdefinition mit vorhandener Deklaration gefunden<br />
1&gt; Definition<br />
1&gt; 'outer&lt;T&gt;::inner&lt;U&gt; outer&lt;T&gt;::createInner(void)'<br />
1&gt; Vorhandene Deklarationen<br />
1&gt; 'outer&lt;T&gt;::inner&lt;U&gt; outer&lt;T&gt;::createInner(void)'<br />
1&gt;<br />
1&gt;Fehler beim Erstellen</p>
</blockquote>
<p>Lasse ich das template hingegen weg, so kompiliert es.</p>
<p>--</p>
<p>Variante2 gefällt mir natürlich am besten, hatte ich mir noch gar nicht angewöhnt, habe aber Mal einen Artikel über die &quot;nachgelagerte return type&quot;-Notation gelesen und mich gefreut, danke für den Hinweis. <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/2327275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327275</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 30 May 2013 09:34:09 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 10:14:14 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Ist das dann MSVC10s Fehler?</p>
</blockquote>
<p>Ja, template ist an dieser Stelle auch in C++03 erlaubt.</p>
<p>Ich korrigiere allerdings meine vorherige Aussage:<br />
weder template noch typename sind an dieser Stelle erforderlich (aber einzeln oder zusammen zulässig), weil<br />
outer&lt;T&gt;::inner ein member der <em>current instantiation</em> ist und damit bereits in der Templatedefinition<br />
beim Namelookup gefunden und als Klassentemplate identifiziert werden kann.<br />
Das ist allerdings für den Compiler schwer zu <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#560" rel="nofollow">parsen</a> (g++ weigert sich, clang hat kein Problem).<br />
Da es beim flüchtigen Lesen auch verwirren kann, würde ich an dieser Stelle immer beide Schlüsselwörter verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327289</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 30 May 2013 10:14:14 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 10:46:59 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ah, verstehe! Erfordert das dieselben Parse-Fähigkeiten wie z.B. hier:</p>
<pre><code class="language-cpp">class Test
{
    enum SomeEnum {A, B} enum;

public:
    SomeEnum GetEnum() const;
};

SomeEnum Test::GetEnum() const // will Test::SomeEnum
{
    return enum;
}
</code></pre>
<p>was bei mir auch nie kompiliert? Da erscheint die auto-Notation für Rückgabetypen ja fast auch als Reaktion darauf in den Standard aufgenommen worden zu sein, dass die Compiler &quot;unfähig&quot; (will nicht urteilen) sind (wobei ich damit natürlich nicht meine, dass das der einzige Vorteil dieser Notation ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327297</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 30 May 2013 10:46:59 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 10:59:19 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Hi,</p>
<p>ah, verstehe! Erfordert das dieselben Parse-Fähigkeiten wie z.B. hier:</p>
<pre><code class="language-cpp">class Test
{
    enum SomeEnum {A, B} enum;

public:
    SomeEnum GetEnum() const;
};

SomeEnum Test::GetEnum() const // will Test::SomeEnum
{
    return enum;
}
</code></pre>
<p>was bei mir auch nie kompiliert? Da erscheint die auto-Notation für Rückgabetypen ja fast auch als Reaktion darauf in den Standard aufgenommen worden zu sein, dass die Compiler &quot;unfähig&quot; (will nicht urteilen) sind (wobei ich damit natürlich nicht meine, dass das der einzige Vorteil dieser Notation ist).</p>
</blockquote>
<p>Dieses Beispiel ist definitv ill-formed und nicht vergleichbar (wobei ich verstehe, dass es wie ein verwandtes Problem aussieht). SomeEnum wird hier durch unqualifiziertes Lookup gesucht, und der Stadard ist klar, das erst nach dem Funktionsnamen (also ab der öffnenden Klammer, folglich funktioniert es auch hier mit einem trailing Returntyp) dieses Lookup im Scope der Klasse stattfindet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327307</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 30 May 2013 10:59:19 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 11:08:14 GMT]]></title><description><![CDATA[<p>Achso, krass. Hat es besondere Gründe, dass beim Rückgabetyp kein ADL (hoffe, ich benutze den Begriff jetzt nicht falsch) greifen darf? Fände ich intuitiver und ich sehe jetzt keinen Nachteil, der nicht auch für Parameter gelten würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327308</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 30 May 2013 11:08:14 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 11:11:55 GMT]]></title><description><![CDATA[<blockquote>
<p>&quot;nachgelagerte return type&quot;</p>
</blockquote>
<p>trailing-return-type.</p>
<blockquote>
<p>weder template noch typename sind an dieser Stelle erforderlich (aber einzeln oder zusammen zulässig), weil<br />
outer&lt;T&gt;::inner ein member der current instantiation ist und damit bereits in der Templatedefinition<br />
beim Namelookup gefunden und als Klassentemplate identifiziert werden kann.</p>
</blockquote>
<p>Ich kann die Standardstelle nicht genau finden. Ich denke, es ist</p>
<p>[temp.dep.type]/1 schrieb:</p>
<blockquote>
<p>A name refers to the current instantiation if it is<br />
— in the definition of [...]a member of a class template [...] the injected-class-name (Clause 9) of the [...] nested class,</p>
</blockquote>
<blockquote>
<p>// will Test::SomeEnum</p>
</blockquote>
<p>Jo, aber natürlich wird <code>SomeEnum</code> nicht gefunden. Ich finde, das würde auch sehr komisch sein, wenn das tatsächlich so funktionieren würde <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>Dieses Beispiel ist definitv ill-formed und nicht vergleichbar</p>
</blockquote>
<p><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>
<blockquote>
<p>dass die Compiler &quot;unfähig&quot; [...] sind</p>
</blockquote>
<p>Ich denke, daran liegt es nicht. Wäre das so schwer, hätte man es aus dem Standard entfernt (wie <code>export</code> ).<br />
Aber der Standard definiert es ähnlich:</p>
<blockquote>
<p>A trailing-return-type is <strong>most useful for a type that would be more complicated to specify <em>before</em> the<br />
declarator-id</strong>.</p>
</blockquote>
<p>(camper meint übrigens die declarator-id)</p>
<blockquote>
<p>Hat es besondere Gründe, dass beim Rückgabetyp kein ADL [...] greifen darf?</p>
</blockquote>
<p>Ich dachte, ADL ist nur für Funktions<strong>aufrufe</strong> und hat hier gar nix verloren <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="😕"
    /> - aber wie so oft kann ich mich ja auch irren <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>
<blockquote>
<p>When the postfix-expression in a <strong>function call</strong> is an unqualified-id, other namespaces not considered<br />
during the usual unqualified lookup (3.4.1) may be searched [...]</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2327309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327309</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 30 May 2013 11:11:55 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 11:26:53 GMT]]></title><description><![CDATA[<p>Okay, danke für die Anmerkungen. <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>Hast Du dich jetzt bzgl. ADL geirrt oder nicht? Klingt für mich doch, als hättest Du damit recht gehabt. Hat hier wohl wirklich überhaupt nichts verloren.</p>
<p>Trotzdem erscheint es mir nach wie vor intuitiv, dass er auch im Klassenscope sucht, wenn es um den Rückgabetypen geht. Für mich gehört der einfach zur Methode dazu und die Methode gehört für mich zur Klasse. Bin ich da allein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327315</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 30 May 2013 11:26:53 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 11:29:07 GMT]]></title><description><![CDATA[<p>Wenn ich mich nicht irre:<br />
ADL ist ja dafür da, dass wenn du eine Funktion mit unqualifizierten Namen aufrufst, für den Funktionsnamen auch in anderen Namensräumen in <strong>festgelegter Reihenfolge</strong> gesucht wird, oder entsprechend für Operatorfunktionen - diese Namensräume werden durch die Argumente festgelegt (<strong>argument dependent</strong> name-lookup).</p>
<p>Der Rückgabewert wird aber bereits bei der ersten <strong>Deklaration</strong> der Funktion geparst und steht damit <strong>vor jedem Funktionsaufruf</strong> <strong>fest</strong>, bzw. bei der Instantiierung der entsprechenden Spezialisierung einer Funktion.</p>
<p>Edit: Du Schlingel! Hast ja die Anmerkung wegeditiert :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327320</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 30 May 2013 11:29:07 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 11:30:23 GMT]]></title><description><![CDATA[<p>Ja, habe ADL Mal nachgeschlagen statt doof rumzuraten und fest gestellt, dass ich mir mein Gelaber hätte sparen können.</p>
<p>Bleibt also nach wie vor nur meine Anmerkung:</p>
<blockquote>
<p>Trotzdem erscheint es mir nach wie vor intuitiv, dass er auch im Klassenscope sucht, wenn es um den Rückgabetypen geht. Für mich gehört der einfach zur Methode dazu und die Methode gehört für mich zur Klasse. Bin ich da allein?</p>
</blockquote>
<p><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/2327322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327322</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 30 May 2013 11:30:23 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 11:44:37 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Bleibt also nach wie vor nur meine Anmerkung:</p>
<blockquote>
<p>Trotzdem erscheint es mir nach wie vor intuitiv, dass er auch im Klassenscope sucht, wenn es um den Rückgabetypen geht. Für mich gehört der einfach zur Methode dazu und die Methode gehört für mich zur Klasse. Bin ich da allein?</p>
</blockquote>
</blockquote>
<p>Leider habe ich, und wahrscheinlich auch du, zu wenig Erfahrung um darüber eine vernünftige Aussage machen zu können. Ich sage mal pauschal nein, weil ich es erstens, wie camper, unübersichtlich finde. Und zweitens da ich denke dass das öfters, gerade bei Programmen die davon Gebrauch machen, zu Mehrdeutigkeit führen kann.*</p>
<p>*Natürlich ist das nur eine Qualifizierung nötig um alles wieder ins Lot zu bringen - aber dann haben wir dadurch auch nichts gewonnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327327</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 30 May 2013 11:44:37 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 13:58:44 GMT]]></title><description><![CDATA[<p>LOL<br />
Gerade überarbeite ich ein altes Projekt von mir - und gerade ändere ich Zehn out-of-class Memberfunktions-Definitionen zu trailing-return-types. <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/2327354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327354</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 30 May 2013 13:58:44 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 14:06:07 GMT]]></title><description><![CDATA[<p>Im Allgemeinen wird eine Name unmittelbar aufgelöst, sobald er auftritt (nicht zuletzt, weil häufig erst diese Auflösung es ermöglicht, den Rest des Codes richtig zu interpretieren).<br />
Außerhalb einer Templatedeklaration sind die Regeln recht einfach:<br />
Sobald irgendein Name (ohne vorangestelltes :: ) auftritt, wird er unqualifiziert gesucht, und zwar in dem Scope, in dem in dem er lexikalisch auftritt.<br />
Wird eine entsprechende Entität (oder ggf. mehrere) gefunden, muss entsprechend kontextabhängig je nach Art der Entität weiter geparst werden.<br />
Wird der Name <em>nicht</em> gefunden, muss die Stelle daraufhin untersucht werden, ob es sich (syntaktisch) um einen Funktionsaufruf handelt. Ist das der Fall und erlauben es die Argumente, so ist der Funktionsname per ADL zu suchen (ADL interessiert sich grundsätzlich nur für Funktionen oder Funktionstemplates - außerdem kommt es nat. ggf. zu ADL, wenn zuvor bereits eine Funktion gefunden wurde).</p>
<p>Innerhalb einer Templatedeklaration sind diese Regeln auch einfach:<br />
es sind die Gleichen (außer dass ein zweiter ADL-Pass ggf. erst bei der Instantiierung vorzunehmen ist).</p>
<p>Erfolgt eine Deklaration eines Members außerhalb der Klasse, so ist der lexikalische Scope der Deklaration (die bei Membern auch eine Definition sein muss) zu beachten, nur die Teile, die der deklarator-id folgen befinden sich im Scope der Klasse.</p>
<pre><code class="language-cpp">namespace foo
{
    struct bar
    {
        typedef int type;
        type fun();
    };
}
typedef char type;
type foo::bar::fun(); // ill-formed - type ist ::type
</code></pre>
<p>Sowohl im Nicht-Template- als auch im Templatefall muss also im Allgemeinen ein qualifizierter Bezeichner verwendet werden, wenn diese Syntax benutzt wird.</p>
<p>Wesentliche Unterschiede zwischen Nicht-Templates und Templates gibt es hingegen, wenn es um <em>qualifizierte</em> Bezeichner oder Memberzugriffe geht, und dieser Bezeichner von einem Templateparameter abhängt.<br />
Im Wesentlichen:<br />
<em>Abhängige Bezeichner</em> sind solche, die<br />
1. von einem Templateparameter abhängig sind,<br />
2. nicht Member der <em>current instantiation</em> sind (ich traue mich nicht das zu übersetzen, ich finde auch den englischen Begriff furchtbar)<br />
Abhängige Bezeichner benötigen jeweils die Schlüsselworte typename oder template, wenn es sich um Typen bzw. Templates handelt, es sei denn der Kontext verbietet sie ausdrücklich. Bezeichner, die von einem Templateparameter abhängen aber keine <em>Abhängigen Bezeichner</em> sind (also Member der <em>current instantitiation</em>) dürfen, wenn der Kontext es erlaubt mit typename/template versehen werden (sowohl in C++03 als auch C++11) - und das ist gut so, weil man ggf. erst 10mal hinschauen muss, um die Unterscheidung machen zu können.<br />
Und C++11 erlaubt typename/template ausserdem noch an fast allen anderen Stellen, an denen die Syntax es hergibt, insbesondere auch ausserhalb von Templates.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327357</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 30 May 2013 14:06:07 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 14:40:28 GMT]]></title><description><![CDATA[<blockquote>
<p>2. nicht Member der current instantiation sind (ich traue mich nicht das zu übersetzen, ich finde auch den englischen Begriff furchtbar)</p>
</blockquote>
<p>Er ist auch nicht korrekt. Die Instantiierung ist ein Prozess. Was sie meinen ist die <strong>aktuell instantiierte Spezialisierung</strong>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327364</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 30 May 2013 14:40:28 GMT</pubDate></item><item><title><![CDATA[Reply to typename vs. T::template nochmal on Thu, 30 May 2013 14:48:35 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>2. nicht Member der current instantiation sind (ich traue mich nicht das zu übersetzen, ich finde auch den englischen Begriff furchtbar)</p>
</blockquote>
<p>Er ist auch nicht korrekt. Die Instantiierung ist ein Prozess. Was sie meinen ist die <strong>aktuell instantiierte Spezialisierung</strong>.</p>
</blockquote>
<p>Das macht ihn furchtbar aber nicht inkorrekt.<br />
Er wird so <em>kursiv</em> im Standard an dieser Stelle verwendet, was auf einen explizit definierten Begriff verweist (schließe ich mal, ich vermute das wird in einem der in 1.2 genannten Standards (2382 hab ich nicht) so vorgegeben, in 1.6 wird nur gesagt, was Kursivschrift innerhalb von grammatikalischen Spezifikationen bedeuten soll).</p>
<p>Deine Übersetzung geht in die richtige Richtungg, ist aber auch nicht korrekt. Weil des um Bezeichner innerhalb einer Templatedefinition geht. Nicht um die Instantiierung derselben (nat. ist da eine Verbindung).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327365</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 30 May 2013 14:48:35 GMT</pubDate></item></channel></rss>