<?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[Iterator eines Containers einer Eingebetteten Klasse einer Templateklasse kann nicht deklariert werden]]></title><description><![CDATA[<p>Hallo</p>
<p>Hier ein kompilierbarer Minimal-Code</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

template &lt;class T&gt;
class Outer
{
  public :
  Outer() {std::cout &lt;&lt; &quot;Outer::Outer&quot; &lt;&lt; std::endl;};
  ~Outer() {std::cout &lt;&lt; &quot;Outer::~Outer&quot; &lt;&lt; std::endl;};

  class Inner
  {
    public :
      Inner() {std::cout &lt;&lt; &quot;Inner::Inner&quot; &lt;&lt; std::endl;};
      ~Inner() {std::cout &lt;&lt; &quot;Inner::~Inner&quot; &lt;&lt; std::endl;};
  };
  typedef std::vector&lt;Inner&gt; InnerV;

  InnerV m_v;
  void Test();

};

template &lt;class T&gt;
void Outer&lt;T&gt;::Test()
{
  InnerV v;
  v.push_back(Inner());
}

int main()
{
  Outer&lt;int&gt; Test;
  Test.m_v.push_back(Outer&lt;int&gt;::Inner());
  Outer&lt;int&gt;::InnerV::iterator neu;
}
</code></pre>
<p>Außerhalb der Outer-Klasse kann ich also den Iterator neu deklarieren und auch wie erwartet verwenden.<br />
Wenn ich aber innerhalb der Klasse Outer das selbe will kann ich nur durch expliziete Angabe des Templatetypes wieder etwas kompilierbares bekommen</p>
<pre><code class="language-cpp">void Outer&lt;T&gt;::Test()
{
  InnerV v;
  v.push_back(Inner());
  Outer&lt;int&gt;::InnerV::iterator neu;
}
</code></pre>
<p>Versuche ich hingegen den Templateparameter zu übernehmen</p>
<pre><code class="language-cpp">void Outer&lt;T&gt;::Test()
{
  InnerV v;
  v.push_back(Inner());
  Outer&lt;T&gt;::InnerV::iterator neu;
}
</code></pre>
<p>oder gar wegzulassen</p>
<pre><code class="language-cpp">void Outer&lt;T&gt;::Test()
{
  InnerV v;
  v.push_back(Inner());
  InnerV::iterator neu;
}
</code></pre>
<p>bekomme ich vom MinGW-Compiler in der iterator-Zeile den Fehler</p>
<blockquote>
<p>expected ';' before &quot;neu&quot;</p>
</blockquote>
<p>Ich habe in den üblichen Erläuterungen zu Templates keine Erklärung oder Lösung gefunden. Was ist nun falsch?</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/182231/iterator-eines-containers-einer-eingebetteten-klasse-einer-templateklasse-kann-nicht-deklariert-werden</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 22:05:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182231.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 May 2007 20:55:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Iterator eines Containers einer Eingebetteten Klasse einer Templateklasse kann nicht deklariert werden on Tue, 22 May 2007 20:55:56 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Hier ein kompilierbarer Minimal-Code</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

template &lt;class T&gt;
class Outer
{
  public :
  Outer() {std::cout &lt;&lt; &quot;Outer::Outer&quot; &lt;&lt; std::endl;};
  ~Outer() {std::cout &lt;&lt; &quot;Outer::~Outer&quot; &lt;&lt; std::endl;};

  class Inner
  {
    public :
      Inner() {std::cout &lt;&lt; &quot;Inner::Inner&quot; &lt;&lt; std::endl;};
      ~Inner() {std::cout &lt;&lt; &quot;Inner::~Inner&quot; &lt;&lt; std::endl;};
  };
  typedef std::vector&lt;Inner&gt; InnerV;

  InnerV m_v;
  void Test();

};

template &lt;class T&gt;
void Outer&lt;T&gt;::Test()
{
  InnerV v;
  v.push_back(Inner());
}

int main()
{
  Outer&lt;int&gt; Test;
  Test.m_v.push_back(Outer&lt;int&gt;::Inner());
  Outer&lt;int&gt;::InnerV::iterator neu;
}
</code></pre>
<p>Außerhalb der Outer-Klasse kann ich also den Iterator neu deklarieren und auch wie erwartet verwenden.<br />
Wenn ich aber innerhalb der Klasse Outer das selbe will kann ich nur durch expliziete Angabe des Templatetypes wieder etwas kompilierbares bekommen</p>
<pre><code class="language-cpp">void Outer&lt;T&gt;::Test()
{
  InnerV v;
  v.push_back(Inner());
  Outer&lt;int&gt;::InnerV::iterator neu;
}
</code></pre>
<p>Versuche ich hingegen den Templateparameter zu übernehmen</p>
<pre><code class="language-cpp">void Outer&lt;T&gt;::Test()
{
  InnerV v;
  v.push_back(Inner());
  Outer&lt;T&gt;::InnerV::iterator neu;
}
</code></pre>
<p>oder gar wegzulassen</p>
<pre><code class="language-cpp">void Outer&lt;T&gt;::Test()
{
  InnerV v;
  v.push_back(Inner());
  InnerV::iterator neu;
}
</code></pre>
<p>bekomme ich vom MinGW-Compiler in der iterator-Zeile den Fehler</p>
<blockquote>
<p>expected ';' before &quot;neu&quot;</p>
</blockquote>
<p>Ich habe in den üblichen Erläuterungen zu Templates keine Erklärung oder Lösung gefunden. Was ist nun falsch?</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290180</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 22 May 2007 20:55:56 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator eines Containers einer Eingebetteten Klasse einer Templateklasse kann nicht deklariert werden on Tue, 22 May 2007 21:44:19 GMT]]></title><description><![CDATA[<p>Hi,<br />
die Problemstellen müssen richtig so aussehen:</p>
<pre><code class="language-cpp">typename InnerV::iterator neu;
typename Outer&lt;T&gt;::InnerV::iterator neu;
</code></pre>
<p>Wenn du InnerV:: schreibst, ist das innerhalb der Methodendefinition der eigenen Klasse, wie Outer&lt;T&gt;::InnerV::, da du ja eh schon in dem Scope bist. Also können wir beide gleich betrachten <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>Ist ja auch klar genauso wie bei:</p>
<pre><code class="language-cpp">class MyClass {
   public:
          class La { }
          void test() 
          {
            // beides das selbe
            La zz;
            MyClass::La zt;
          }
};
</code></pre>
<p>Bei Templates eben genau der selbe Fall.</p>
<p>Zu dem wieso da ein typename muss.</p>
<pre><code class="language-cpp">// iterator nicht von nem Templateparameter abhängig, da schon TemplateParameter feststeht
Outer&lt;int&gt;::InnerV::iterator neu;
// T noch unbekannt, deswegen ist iterator davon abhängig, was T sein wird
typename Outer&lt;T&gt;::InnerV::iterator neu;
// dito
typename InnerV::iterator neu;
</code></pre>
<p>Weiß nicht, ob du letzten Erklärung so stimmen, aber sind für mich so am logischsten <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1290212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290212</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 22 May 2007 21:44:19 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator eines Containers einer Eingebetteten Klasse einer Templateklasse kann nicht deklariert werden on Tue, 22 May 2007 21:42:01 GMT]]></title><description><![CDATA[<p>Mir stellt sich auch gerade die Frage, ob das auch nicht ohne typename funktionieren sollte.</p>
<p>Da besteht schon zwar die Template-Parameter-Abhängigkeit, aber doch nicht bei InnerV. InnerV ist immer InnerV. Also doch egal was bei Outer&lt;T&gt; T ist.<br />
Oder irre ich mich da ???</p>
<pre><code class="language-cpp">// all the same
Outer&lt;int&gt;::InnerV a;
Outer&lt;float&gt;::InnerV b;
Outer&lt;double&gt;::InnerV c;
// ??
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1290215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290215</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 22 May 2007 21:42:01 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator eines Containers einer Eingebetteten Klasse einer Templateklasse kann nicht deklariert werden on Tue, 22 May 2007 21:45:46 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Danke das läßt sich nun kompilieren.<br />
Diesen Einsatz von typename kannte ich noch nicht, hab ich auch in den letzten Stunden suchen nicht gefunden.</p>
<p>So ganz klar ist mir aber nocht nicht warum der vector sich deklarieren und benutzen läßt, ein iterator des vectors ohne nachhilfe nicht.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290218</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 22 May 2007 21:45:46 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator eines Containers einer Eingebetteten Klasse einer Templateklasse kann nicht deklariert werden on Tue, 22 May 2007 22:02:50 GMT]]></title><description><![CDATA[<p>akari schrieb:</p>
<blockquote>
<p>So ganz klar ist mir aber nocht nicht warum der vector sich deklarieren und benutzen läßt, ein iterator des vectors ohne nachhilfe nicht.</p>
</blockquote>
<p>Jetzt wo du es sagst, fällts mir auch auf. Meinst wohl diese Stelle:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void Outer&lt;T&gt;::Test()
{
  InnerV v;             // Klappt
  v.push_back(Inner());
  InnerV::iterator neu; // Klappt so nicht
}
</code></pre>
<p>Wenn man das so schreiben würde:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void Outer&lt;T&gt;::Test()
{
  Outer&lt;T&gt;::InnerV v;             //typename fehlt
  v.push_back(Inner());
}
</code></pre>
<p>Klappt das nicht, obwohl ich ja mal behauptet habe Outer&lt;T&gt;::InnerV sei das selbe wie InnerV. Wahrscheinlich wird InnerV beim Instanzieren der Templates zu Outer&lt;irgendenBEKANNTERTyp&gt;::InnerV und somit ist da kein typename nötig.</p>
<p>Wieso das bei InnerV::iterator neu; nicht funktioniert, erkläre ich mir so, dass da nochmal ne verschachtelung ist und der Compiler sonst nicht wissen kann, ob iterator wirklich ein Typ ist.</p>
<p>Alles was hier schreibe bezieht sich nicht auf FEST FUNDIERTES WISSEN, ich versuche es mir eher selbst irgendwie zu erklären. Bald wird aber camper oder so auftauchen und es uns erklären <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/1290229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290229</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 22 May 2007 22:02:50 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator eines Containers einer Eingebetteten Klasse einer Templateklasse kann nicht deklariert werden on Tue, 22 May 2007 22:10:38 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>InnerV ist immer InnerV.</p>
</blockquote>
<p>InnerV muss nicht immer InnerV sein.</p>
<pre><code class="language-cpp">template &lt;int&gt;
struct Outer
{
  typedef int Inner; //ätsch
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1290233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290233</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Tue, 22 May 2007 22:10:38 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator eines Containers einer Eingebetteten Klasse einer Templateklasse kann nicht deklariert werden on Tue, 22 May 2007 22:22:21 GMT]]></title><description><![CDATA[<p>@KasF Das ist ziemlich nah dran: typename darf bei einem unqualifizierten Namen weggelassen werden, wenn dieser zuvor im Template deklariert wurde, nicht aber, wenn du auf ihn qualifiziert verwendest - einfach deshalb, weil der Standard es so vorsieht</p>
<p>ISO/IEC 14882:2003 schrieb:</p>
<blockquote>
<p>14.6 [temp.res] /6<br />
Within the definition of a class template or within the definition of a member of a class template, the keyword typename is not required when referring to the unqualified name of a previously declared member of the class template that declares a type. The keyword typename shall always be specified when the member is referred to using a qualified name, even if the qualifier is simply the class template name.<br />
[Example:<br />
template&lt;class T&gt; struct A {<br />
typedef int B;<br />
A::B b; // ill-formed: typename required before A::B<br />
void f(A&lt;T&gt;::B); // ill-formed: typename required before A&lt;T&gt;::B<br />
typename A::B g(); // OK<br />
};<br />
The keyword typename is required whether the qualified name is A or A&lt;T&gt; because A or A&lt;T&gt; are synonyms within a class template with the parameter list &lt;T&gt;. ]</p>
</blockquote>
<p>Die typename Regeln sind unnötig streng, was ihr Verständnis erschwert. In C++0x wird sich das bessern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290245</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 22 May 2007 22:22:21 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator eines Containers einer Eingebetteten Klasse einer Templateklasse kann nicht deklariert werden on Wed, 23 May 2007 09:36:16 GMT]]></title><description><![CDATA[<p>Ah Danke.<br />
Wie siehts denn hiermit aus:</p>
<pre><code class="language-cpp">Outer&lt;int&gt;::InnerV::iterator neu;
</code></pre>
<p>Schließlich greife ich auch qualifiziert darauf zu und benötige aber kein typename.<br />
Kommt davon das der Templateparameter schon feststeht ? Im Standard habe ich dazu nichts gefunden ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290459</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 23 May 2007 09:36:16 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator eines Containers einer Eingebetteten Klasse einer Templateklasse kann nicht deklariert werden on Thu, 24 May 2007 11:27:27 GMT]]></title><description><![CDATA[<p>Exakt,<br />
bei voll qualifizierten Aufrufen braucht man kein &quot;typename&quot;, da alle Bezeichner aufgelöst werden können. Nur innerhalb einer Template-Definition, weiß der Compiler halt nicht, welchen Pseudo-Code er erstellen soll, d.h. der Programmierer muß dann halt festlegen: Typ oder Variable (und zwar für alle möglichen Template-Instanziierungen &lt;- schreibt man das so?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291346</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Thu, 24 May 2007 11:27:27 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator eines Containers einer Eingebetteten Klasse einer Templateklasse kann nicht deklariert werden on Thu, 24 May 2007 11:39:48 GMT]]></title><description><![CDATA[<p>Achso Danke, also gibt es auch einen Unterschied zw. qualifiziert und voll qualifiziert <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/1291352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291352</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 24 May 2007 11:39:48 GMT</pubDate></item></channel></rss>