<?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[Vererbung innerhalb einer generischen Klasse]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>wenn ich innerhalb einer generischen Klasse zwei weitere Klassen lokal definiere, wobei die eine von der anderen eine &quot;protected Element-variable&quot; erbt, kann von dieser aus nicht auf die Variable der Basisklasse zugegriffen werden. In einer nicht generischen Klasse funktioniert dies aber.<br />
Was mache ich falsch? Liegt das am Compiler(Dev-C++)?</p>
<p>Hier der Code:</p>
<pre><code class="language-cpp">template &lt;class Type&gt; //Ohne diese Zeile funktioniert es.
class Hauptklasse
{
public:
    class Basis
    {
    protected:
       int a;
    };

    class Abgeleitet : public Basis
    {
    public:
        void test()
        {
            a; //Fehler: &quot;'a' undeclared&quot; tritt nur bei generischer Hauptklasse auf.
        }
    };
};
</code></pre>
<p>Hoffe auf eine Lösung.<br />
Danke im Voraus</p>
<p>Gruss ganesh</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/306342/vererbung-innerhalb-einer-generischen-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 07:36:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306342.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Jul 2012 13:40:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vererbung innerhalb einer generischen Klasse on Wed, 25 Jul 2012 13:40:00 GMT]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>wenn ich innerhalb einer generischen Klasse zwei weitere Klassen lokal definiere, wobei die eine von der anderen eine &quot;protected Element-variable&quot; erbt, kann von dieser aus nicht auf die Variable der Basisklasse zugegriffen werden. In einer nicht generischen Klasse funktioniert dies aber.<br />
Was mache ich falsch? Liegt das am Compiler(Dev-C++)?</p>
<p>Hier der Code:</p>
<pre><code class="language-cpp">template &lt;class Type&gt; //Ohne diese Zeile funktioniert es.
class Hauptklasse
{
public:
    class Basis
    {
    protected:
       int a;
    };

    class Abgeleitet : public Basis
    {
    public:
        void test()
        {
            a; //Fehler: &quot;'a' undeclared&quot; tritt nur bei generischer Hauptklasse auf.
        }
    };
};
</code></pre>
<p>Hoffe auf eine Lösung.<br />
Danke im Voraus</p>
<p>Gruss ganesh</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235567</guid><dc:creator><![CDATA[ganesh123]]></dc:creator><pubDate>Wed, 25 Jul 2012 13:40:00 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung innerhalb einer generischen Klasse on Wed, 25 Jul 2012 14:08:27 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;class Type&gt; 
class Hauptklasse
{
public:
    class Basis
    {
    protected:
       int a;
    };

  class Abgeleitet : public Hauptklasse&lt;Type&gt;::Basis
    {
    public:
        void test()
        {
          this-&gt;a; 
        }
    };
};
</code></pre>
<p>Das liegt da dran, dass Hauptklasse noch nicht instanziert wurde, daher existiert auch kein Basis. Daher muss man genau sagen, was man fur eine Basisklasse möchte (Ziele 11).</p>
<p>Weiterhin existiert aus dem gleichen Grund die Basisklasse noch nicht, wenn der Code in Zeile 16 geprüft wird, daher muss man auch genauer sagen, was das a sein soll. Also entweder <code>Hauptklasse&lt;Type&gt;::Basis::a;</code> (ein typedef drängt sich auf <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="🙂"
    /> ) oder wie hier <code>this-&gt;a;</code> , damit klar ist, dass es sich um einen Member unserer Klasse handeln soll.</p>
<p>Später, falls die Klasse mal tatsächlich instanziert wird, werden diese Bedingungen dann geprüft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235584</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 25 Jul 2012 14:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung innerhalb einer generischen Klasse on Wed, 25 Jul 2012 14:29:34 GMT]]></title><description><![CDATA[<p>Der Compiler hat recht, die Begründung ist (in diesem Fall) etwas unintuitiv.<br />
Während des unqualifizierten Lookups von nicht-abhängigen Bezeichnern werden abhängige (gemeint ist abhängig von den den Templateargumenten) Basisklassen nicht durchsucht, weil ja erst bei der Instantiierung kalr ist, welche konkrete Spezialisierung zu benutzen ist, die Bedeutung des Bezeichners kann ja zwischen verschiedenen Spezialisierungen variieren. Das ist - wenn man schon ein wenig mit Templates gearbeitet hat - nichts Neues.<br />
Ein Bezeichner ist aber tyischerweise nicht abhängig, wenn er auf ein Member der <em>gegenwärtigen</em> Instantiierung verweist (auch nichts Neues, andernfalls würde eine Menge Code völlig unleserlich werden).<br />
z.B.</p>
<pre><code class="language-cpp">int x;
template &lt;typename T&gt;
class foo
{
    static T x;
    static const auto s = sizeof(x); // gemeint ist foo&lt;T&gt;::x , nicht das äußere x
};
</code></pre>
<p><em>Gegenwärtige Instantiierung</em> bezieht sich aber nur auf auf den gegenwärtigen Member oder die gegenwärtige verschachtelte Klasse oder die Templateklasse selbst, nicht aber auf <em>andere</em> verschachtelte Klassen, auch wenn sieht zur gleichen Templateklasse gehören.</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
class foo
{
    class X;
    class Y
    {
    // hier ist X abhängig
    };

    class X : Y
    {
    //hier ist Y abhängig
    };
};
</code></pre>
<p>Nachdem also klar ist, dass Basis::a an der Stelle ein abhängiger Bezeichner ist, muss der Ausdruck nur noch so umgeformt werden, dass es sich um einen <em>abhängigen Ausdruck</em> handelt.<br />
Dafür gibt es wieder mehrere Möglichkeiten, in der Regel wird man eine der ersten beiden Varianten verwenden</p>
<pre><code class="language-cpp">Basis::a;       // ein qualifizierter Name ist abhängig, wenn der Namensraum (d.h. der Typ) abhängig ist
this-&gt;a;             // this ist immer abhängig
</code></pre>
<p>Man kann noch mehr finden, z.B.</p>
<pre><code class="language-cpp">template &lt;typename T&gt; struct identity { typedef T type; };

Hauptklasse&lt;typename identity&lt;T&gt;::type&gt;::Abgeleitet::a; //kann in Templatecode nützlich sein, wenn die Basisklasse schwer aufzuschreiben ist, und this nicht verwendet werden kann
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2235594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235594</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 25 Jul 2012 14:29:34 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung innerhalb einer generischen Klasse on Wed, 25 Jul 2012 14:35:30 GMT]]></title><description><![CDATA[<p>Ich fürchte, da muss ich dir widersprechen, Sepp. Das Problem ist nicht, dass die Basisklasse nicht genau benannt wird -- die kann der Compiler aus dem Kontext herleiten -- sondern esoterische Lookup-Regeln für Templates.</p>
<p>So geht's:</p>
<pre><code class="language-cpp">template &lt;class Type&gt; //Ohne diese Zeile funktioniert es.
class Hauptklasse
{
public:
    class Basis
    {
    protected:
       int a;
    };

    class Abgeleitet : public Basis
    {
    using Basis::a; // &lt;-- Hier

    public:
        void test()
        {
            a;
        }
    };
};
</code></pre>
<p>Die Basisklasse wird für die Namensauflösung an dieser Stelle sonst schlicht nicht herangezogen. Das hängt damit zusammen, dass Hauptklasse keine Klasse, sondern eine Klassenvorlage ist, wodurch Basis und Abgeleitet es auch werden. Man dachte dabei wohl an Fälle wie diesen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

void foo() { std::cout &lt;&lt; &quot;Hallo, Welt.\n&quot;; }

template &lt;class Type&gt; //Ohne diese Zeile funktioniert es.
class Hauptklasse
{
public:
  class Basis
  {
  };

  class Abgeleitet : public Basis
  {
  public:
    void test()
      {
        foo();
      }
  };
};

template&lt;&gt; class Hauptklasse&lt;int&gt;::Basis {
protected:
  void foo() { std::cout &lt;&lt; &quot;Hähä, ich böser Bursche!\n&quot;; }
};

int main() {
  Hauptklasse&lt;double&gt;::Abgeleitet abg2;
  Hauptklasse&lt;int&gt;::Abgeleitet abg;

  abg.test();
  abg2.test();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2235599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235599</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Wed, 25 Jul 2012 14:35:30 GMT</pubDate></item><item><title><![CDATA[Reply to Vererbung innerhalb einer generischen Klasse on Wed, 25 Jul 2012 15:27:29 GMT]]></title><description><![CDATA[<p>Danke für die raschen Lösungen und Erklärungen!<br />
Gruss ganesh123</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235627</guid><dc:creator><![CDATA[ganesh123]]></dc:creator><pubDate>Wed, 25 Jul 2012 15:27:29 GMT</pubDate></item></channel></rss>