<?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[Operatoren-Vererbung bei generischer Vererbung]]></title><description><![CDATA[<p>Hi, folgender Code liefert bei mir falsche Resultate (VC8) bzw. kompiliert gar nicht erst (GCC4):</p>
<pre><code class="language-cpp">template &lt;typename D&gt;
struct Base {
    virtual D&amp; operator ++() = 0;
    D operator ++(int)
    {
        D ret = *dynamic_cast&lt;D*&gt;(this);
        ++*this;
        return ret;
    }
    virtual ~Base() { }
};

struct Derived : Base&lt;Derived&gt; {
    Derived() : m_value() { }

    Derived&amp; operator ++()
    {
        ++m_value;
        return *this;
    }

    int operator *() const { return m_value; }

private:
    int m_value;
};

int main()
{
    Derived d;
    cout &lt;&lt; *d++ &lt;&lt; endl;
}
</code></pre>
<p>Angeblich wird kein Postfix-op++ gefunden. Komisch, ich sehe ihn doch aber. Wieso erbt 'Derived' den Operator denn nicht? Wo liegt mein Fehler?</p>
<p>(PS: VC8 warnt, verwendet aber den Präfix-op++, d.h. die Ausgabe des Codes ist &quot;1&quot;, ich hätte aber &quot;0&quot; erwartet und gewollt. Es nützt übrigens nichts, den Postfix-op++ virtuell zu machen.)</p>
<p>/EDIT: Einmal &quot;Vererbung&quot; im Titel entfernt. :-p</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/172848/operatoren-vererbung-bei-generischer-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 02:40:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/172848.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 08 Feb 2007 22:08:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operatoren-Vererbung bei generischer Vererbung on Thu, 08 Feb 2007 22:08:53 GMT]]></title><description><![CDATA[<p>Hi, folgender Code liefert bei mir falsche Resultate (VC8) bzw. kompiliert gar nicht erst (GCC4):</p>
<pre><code class="language-cpp">template &lt;typename D&gt;
struct Base {
    virtual D&amp; operator ++() = 0;
    D operator ++(int)
    {
        D ret = *dynamic_cast&lt;D*&gt;(this);
        ++*this;
        return ret;
    }
    virtual ~Base() { }
};

struct Derived : Base&lt;Derived&gt; {
    Derived() : m_value() { }

    Derived&amp; operator ++()
    {
        ++m_value;
        return *this;
    }

    int operator *() const { return m_value; }

private:
    int m_value;
};

int main()
{
    Derived d;
    cout &lt;&lt; *d++ &lt;&lt; endl;
}
</code></pre>
<p>Angeblich wird kein Postfix-op++ gefunden. Komisch, ich sehe ihn doch aber. Wieso erbt 'Derived' den Operator denn nicht? Wo liegt mein Fehler?</p>
<p>(PS: VC8 warnt, verwendet aber den Präfix-op++, d.h. die Ausgabe des Codes ist &quot;1&quot;, ich hätte aber &quot;0&quot; erwartet und gewollt. Es nützt übrigens nichts, den Postfix-op++ virtuell zu machen.)</p>
<p>/EDIT: Einmal &quot;Vererbung&quot; im Titel entfernt. :-p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225377</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 08 Feb 2007 22:08:53 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren-Vererbung bei generischer Vererbung on Thu, 08 Feb 2007 23:12:53 GMT]]></title><description><![CDATA[<p>Hallo,<br />
das Ganze hat nichts mit Templates zu tun, sondern schlicht mit der Art und Weise, wie Überladung funktioniert. Da in derived ein operator++ existiert, wird kein weiterer Scope mehr nach einem op++ durchsucht, d.h. die Kandidatenmenge für die Überladungsauflösung enthält nur den op++ aus derived. Dieser besitzt aber die Prefix-Form und ist damit kein gültiger Kandidat für den Aufruf -&gt; Fehler.</p>
<p>Lösung: Eine using-Deklaration in derived:</p>
<pre><code class="language-cpp">struct Derived : Base&lt;Derived&gt; {
    Derived() : m_value() { }
    using Base&lt;Derived&gt;::operator++;
    Derived&amp; operator ++()
    {
        ++m_value;
        return *this;
    }

    int operator *() const { return m_value; }

private:
    int m_value;
};
</code></pre>
<p>Ausführlicher: <a href="http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&amp;faq=Overload#Answ" rel="nofollow">http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&amp;faq=Overload#Answ</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225401</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Thu, 08 Feb 2007 23:12:53 GMT</pubDate></item><item><title><![CDATA[Reply to Operatoren-Vererbung bei generischer Vererbung on Fri, 09 Feb 2007 08:23:43 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<p>Da in derived ein operator++ existiert, wird kein weiterer Scope mehr nach einem op++ durchsucht</p>
</blockquote>
<p>Lol. Wie konnnte ich das bloß vergessen ...</p>
<p>Na ja, vielen Dank. <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/1225474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225474</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 09 Feb 2007 08:23:43 GMT</pubDate></item></channel></rss>