<?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[delegating constructor curiosity]]></title><description><![CDATA[<p>Mir ist eben gerade beim Verwenden von Konstruktorweiterleitungen etwas aufgefallen.<br />
Und zwar geht es um das &quot;Problem&quot;, dass man nur an die direkte Basisklasse weitergeben kann. Bei einem Klassentemplate, erhielt ich jedoch keine Beschwerde.<br />
Weiteres kann aus den Kommentaren entnommen werden.</p>
<p>Hier der reduzierte Code:</p>
<pre><code>class NTBase
{
private:
    int param_;
public:
    NTBase(int param)
        :param_(param)
    {}
};

template &lt;typename Derived&gt;
class Base : public NTBase
{
public:
    using something = Derived;
    Base(int param)
        :NTBase(param)
    {}
};

template &lt;typename T&gt;
class A : public Base &lt;A&lt;T&gt;&gt;
{
public:
    A(int param)
      //: Base&lt;A&lt;T&gt;&gt;(param) // funktioniert
      //: Base&lt;A&gt;(param) // funktioniert auch (habe ich NICHT erwartet)
        : NTBase(param) // funktioniert auch - Erwarteter Fehler siehe unten in B &lt;- MEIN KNACKPUNKT
      //: Base(param) // funktioniert nicht (habe ich erwartet)
    {}
};

class B : public Base &lt;B&gt;
{
public:
    B(int param)
        : Base(param) // funktioniert (habe ich nicht erwartet)
        : Base&lt;B&gt;(param) // funktioniert auch
        //: NTBase(param) // error: type 'NTBase' is not a direct or virtual base of 'B' (wie erwartet)
    {}
};
</code></pre>
<p>Ist das Compilerverhalten wirklich so korrekt?</p>
<p>EDIT: naja g++ und clang können sich ja wohl nicht beide irren <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/topic/328611/delegating-constructor-curiosity</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 13:07:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328611.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Oct 2014 22:36:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to delegating constructor curiosity on Sat, 18 Oct 2014 22:38:59 GMT]]></title><description><![CDATA[<p>Mir ist eben gerade beim Verwenden von Konstruktorweiterleitungen etwas aufgefallen.<br />
Und zwar geht es um das &quot;Problem&quot;, dass man nur an die direkte Basisklasse weitergeben kann. Bei einem Klassentemplate, erhielt ich jedoch keine Beschwerde.<br />
Weiteres kann aus den Kommentaren entnommen werden.</p>
<p>Hier der reduzierte Code:</p>
<pre><code>class NTBase
{
private:
    int param_;
public:
    NTBase(int param)
        :param_(param)
    {}
};

template &lt;typename Derived&gt;
class Base : public NTBase
{
public:
    using something = Derived;
    Base(int param)
        :NTBase(param)
    {}
};

template &lt;typename T&gt;
class A : public Base &lt;A&lt;T&gt;&gt;
{
public:
    A(int param)
      //: Base&lt;A&lt;T&gt;&gt;(param) // funktioniert
      //: Base&lt;A&gt;(param) // funktioniert auch (habe ich NICHT erwartet)
        : NTBase(param) // funktioniert auch - Erwarteter Fehler siehe unten in B &lt;- MEIN KNACKPUNKT
      //: Base(param) // funktioniert nicht (habe ich erwartet)
    {}
};

class B : public Base &lt;B&gt;
{
public:
    B(int param)
        : Base(param) // funktioniert (habe ich nicht erwartet)
        : Base&lt;B&gt;(param) // funktioniert auch
        //: NTBase(param) // error: type 'NTBase' is not a direct or virtual base of 'B' (wie erwartet)
    {}
};
</code></pre>
<p>Ist das Compilerverhalten wirklich so korrekt?</p>
<p>EDIT: naja g++ und clang können sich ja wohl nicht beide irren <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/2422829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2422829</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Sat, 18 Oct 2014 22:38:59 GMT</pubDate></item><item><title><![CDATA[Reply to delegating constructor curiosity on Sat, 18 Oct 2014 22:48:55 GMT]]></title><description><![CDATA[<p>Der erwartete Fehler kommt auch - und zwar dann wenn du versuchst die Klasse wirklich zu instanzieren.<br />
Templates solle man immer erstmal instanzieren bevor man einfach davon ausgeht dass alles passt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2422830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2422830</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 18 Oct 2014 22:48:55 GMT</pubDate></item><item><title><![CDATA[Reply to delegating constructor curiosity on Sat, 18 Oct 2014 23:23:49 GMT]]></title><description><![CDATA[<pre><code>//: Base&lt;A&gt;(param) // funktioniert auch (habe ich NICHT erwartet)
</code></pre>
<p><code>A</code> ist der <em>injected-class-name</em> und ist equivalent zur Spezialisierung die gerade instantiiert wird (also <code>A&lt;T&gt;</code> ).</p>
<pre><code>//: Base(param) // funktioniert (habe ich nicht erwartet)
</code></pre>
<p>Dasselbe gilt für <code>Base</code> - der injected-class-name wird für <code>Base</code> in <code>Base</code> ' Scope eingeführt, sodass du ihn als Typen verwenden kannst - auch in abgeleiteten Klassen (die nach Namen schließlich auch in Scopes von Basisklassen suchen).</p>
<pre><code>: NTBase(param) // funktioniert auch - Erwarteter Fehler siehe unten in B &lt;- MEIN KNACKPUNKT
</code></pre>
<p>Was heißt &quot;funktioniert&quot;? Wie hast du das getestet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2422831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2422831</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 18 Oct 2014 23:23:49 GMT</pubDate></item><item><title><![CDATA[Reply to delegating constructor curiosity on Sun, 19 Oct 2014 04:10:03 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Der erwartete Fehler kommt auch - und zwar dann wenn du versuchst die Klasse wirklich zu instanzieren.<br />
Templates solle man immer erstmal instanzieren bevor man einfach davon ausgeht dass alles passt.</p>
</blockquote>
<p>Hmmm, da war ich wohl zu schnell im Forum <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Arcoth schrieb:</p>
<blockquote>
<pre><code>//: Base&lt;A&gt;(param) // funktioniert auch (habe ich NICHT erwartet)
</code></pre>
<p><code>A</code> ist der <em>injected-class-name</em> und ist equivalent zur Spezialisierung die gerade instantiiert wird (also <code>A&lt;T&gt;</code> ).</p>
<pre><code>//: Base(param) // funktioniert (habe ich nicht erwartet)
</code></pre>
<p>Dasselbe gilt für <code>Base</code> - der injected-class-name wird für <code>Base</code> in <code>Base</code> ' Scope eingeführt, sodass du ihn als Typen verwenden kannst - auch in abgeleiteten Klassen (die nach Namen schließlich auch in Scopes von Basisklassen suchen).</p>
</blockquote>
<p>japp und damit wäre dann alles geklärt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2422836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2422836</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Sun, 19 Oct 2014 04:10:03 GMT</pubDate></item></channel></rss>