<?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[operator overloading mit int und long]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen merkwürdigen Effekt. Hier ein Auszug aus dem Header:</p>
<pre><code class="language-cpp">inline STRING &amp;operator &gt;&gt; ( int value, STRING &amp;destination )
{
    return ((long)value) &gt;&gt; destination;
}
STRING &amp;operator &gt;&gt; ( long value, STRING &amp;destination );
</code></pre>
<p>Wenn der Operator mit einem int aufgerufen wird, soll dieser nach long konvertiert werden und die Version mit long aufgerufen werden. Das klappt auch unter 32-Bit Windows mit den Borland Compilern (BC++ 5.02 und BCB 5) wunderbar. Auf einem System mit 64-Bit Linux und Gnu Compiler bekomme ich eine Rekursion, die natürlich gnadenlos abstürzt.</p>
<p>Meiner Meinung nach ist das Verhalten von Gnu nicht korrekt und der Source Code korrekt. Wie seht Ihr das?</p>
<p>mfg Martin<br />
P.S.: Ich will keine Lösungsvorschläge, die habe ich schon selbst gefunden. Es geht mir nur darum, was der Standard dazu sagt. Deshalb ist auch diese Frage hier und nicht im Linux-Forum.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/273981/operator-overloading-mit-int-und-long</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 20:38:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/273981.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 16 Sep 2010 18:08:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator overloading mit int und long on Thu, 16 Sep 2010 18:08:43 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen merkwürdigen Effekt. Hier ein Auszug aus dem Header:</p>
<pre><code class="language-cpp">inline STRING &amp;operator &gt;&gt; ( int value, STRING &amp;destination )
{
    return ((long)value) &gt;&gt; destination;
}
STRING &amp;operator &gt;&gt; ( long value, STRING &amp;destination );
</code></pre>
<p>Wenn der Operator mit einem int aufgerufen wird, soll dieser nach long konvertiert werden und die Version mit long aufgerufen werden. Das klappt auch unter 32-Bit Windows mit den Borland Compilern (BC++ 5.02 und BCB 5) wunderbar. Auf einem System mit 64-Bit Linux und Gnu Compiler bekomme ich eine Rekursion, die natürlich gnadenlos abstürzt.</p>
<p>Meiner Meinung nach ist das Verhalten von Gnu nicht korrekt und der Source Code korrekt. Wie seht Ihr das?</p>
<p>mfg Martin<br />
P.S.: Ich will keine Lösungsvorschläge, die habe ich schon selbst gefunden. Es geht mir nur darum, was der Standard dazu sagt. Deshalb ist auch diese Frage hier und nicht im Linux-Forum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953528</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Thu, 16 Sep 2010 18:08:43 GMT</pubDate></item><item><title><![CDATA[Reply to operator overloading mit int und long on Thu, 16 Sep 2010 18:12:39 GMT]]></title><description><![CDATA[<p>eintrag bitte löschen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953530</guid><dc:creator><![CDATA[padreigh]]></dc:creator><pubDate>Thu, 16 Sep 2010 18:12:39 GMT</pubDate></item><item><title><![CDATA[Reply to operator overloading mit int und long on Thu, 16 Sep 2010 18:33:09 GMT]]></title><description><![CDATA[<p>Mach die <code>long</code> -Überladung vor dem Aufrufzeitpunkt bekannt.</p>
<p>Übrigens sieht man in C++ eher</p>
<pre><code class="language-cpp">Datenbehaelter &lt;&lt; Wert
</code></pre>
<p>als</p>
<pre><code class="language-cpp">Wert &gt;&gt; Datenbehaelter
</code></pre>
<p><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/1953537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953537</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 16 Sep 2010 18:33:09 GMT</pubDate></item><item><title><![CDATA[Reply to operator overloading mit int und long on Fri, 17 Sep 2010 05:36:40 GMT]]></title><description><![CDATA[<p>Was ist STRING ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953605</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 17 Sep 2010 05:36:40 GMT</pubDate></item><item><title><![CDATA[Reply to operator overloading mit int und long on Fri, 17 Sep 2010 07:48:26 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Mach die <code>long</code> -Überladung vor dem Aufrufzeitpunkt bekannt.</p>
</blockquote>
<p>Das könnte es sein. Der Borland Compiler ist da wohl etwas fehlertoleranter. Was sagt denn der Standard dazu? Bei Memberfunktionen ist ja die Reihenfolge egal. Da das aber keine Memberfunktionen sind, sollte es wohl eher so sein, wie im Standard ANSI-C. Daher ist es wohl doch eher ein Fehler des Borland-Compilers, oder aber das übliche &quot;The behaviour is undefined&quot; und ich hatte nur bisher Glück gehabt. Jedenfalls Danke für den Hinweis. Das habe ich echt übersehen.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Übrigens sieht man in C++ eher</p>
<pre><code class="language-cpp">Datenbehaelter &lt;&lt; Wert
</code></pre>
<p>als</p>
<pre><code class="language-cpp">Wert &gt;&gt; Datenbehaelter
</code></pre>
<p><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>
</blockquote>
<p>Ähm ja, das kann schon sein. Ich muß dazu erklären, daß der Code schon sehr sehr alt ist. Ich habe keine Ahnung mehr, warum ich das damals so gemacht habe. Wahrscheinlich, weil ich vom Motorola-assembler gewohnt bin, zuerst Quelle dann das Ziel.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953626</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Fri, 17 Sep 2010 07:48:26 GMT</pubDate></item><item><title><![CDATA[Reply to operator overloading mit int und long on Fri, 17 Sep 2010 07:45:43 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Was ist STRING ?</p>
</blockquote>
<p>Das spielt zwar für die Beantwortung meiner Frage keine Rolle aber egal:</p>
<p>Das ist eine selbst entwickelte Klasse zur Zeichenkettenverarbeitung ähnlich wie std::string.</p>
<p>Und bevor irgendwelche Bemerkungen kommen, die Klasse ist sehr alt und std::string war damals noch nicht standardisiert bzw gab es noch gar nicht.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953629</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Fri, 17 Sep 2010 07:45:43 GMT</pubDate></item><item><title><![CDATA[Reply to operator overloading mit int und long on Fri, 17 Sep 2010 12:02:06 GMT]]></title><description><![CDATA[<p>mgaeckler schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Mach die <code>long</code> -Überladung vor dem Aufrufzeitpunkt bekannt.</p>
</blockquote>
<p>Das könnte es sein. Der Borland Compiler ist da wohl etwas fehlertoleranter. Was sagt denn der Standard dazu? Bei Memberfunktionen ist ja die Reihenfolge egal. Da das aber keine Memberfunktionen sind, sollte es wohl eher so sein, wie im Standard ANSI-C. Daher ist es wohl doch eher ein Fehler des Borland-Compilers, oder aber das übliche &quot;The behaviour is undefined&quot; und ich hatte nur bisher Glück gehabt. Jedenfalls Danke für den Hinweis. Das habe ich echt übersehen.</p>
</blockquote>
<p>Fehler des Compiler, wahrscheinlich durch dqs inline verursacht. Vermutlich wird die Funktiondefinition noch einmal erneut ausgewertet, wenn der Code inline eingefügt werden soll, und Borland macht dabei den Fehler, die Funktion nicht im Kontext der ursprünglichen Definition zu betrachten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953784</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 17 Sep 2010 12:02:06 GMT</pubDate></item><item><title><![CDATA[Reply to operator overloading mit int und long on Sun, 19 Sep 2010 15:13:23 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Fehler des Compiler, wahrscheinlich durch dqs inline verursacht. Vermutlich wird die Funktiondefinition noch einmal erneut ausgewertet, wenn der Code inline eingefügt werden soll, und Borland macht dabei den Fehler, die Funktion nicht im Kontext der ursprünglichen Definition zu betrachten.</p>
</blockquote>
<p>Ich gehe mittlerweile auch davon aus, daß BC++ Murks macht. Für alle, die's nachstellen wollen:</p>
<pre><code class="language-cpp">#include &lt;string.h&gt;
#include &lt;stdio.h&gt;

class STRING
{
    char    text[256];

    public:
    void setText( const char *t )
    {
        strcpy( text, t );
    }

    const char *getText( void ) const
    {
        return text;
    }
};

STRING &amp;operator &gt;&gt; ( long value, STRING &amp;destination );
inline STRING &amp;operator &gt;&gt; ( int value, STRING &amp;destination )
{
    return ((long)value) &gt;&gt; destination;
}

STRING &amp;operator &gt;&gt; ( long value, STRING &amp;destination )
{
    char    tempBuffer[32];

    sprintf( tempBuffer, &quot;%ld&quot;, value );
    destination.setText( tempBuffer );

    return destination;
}

int main( void )
{
    STRING  str;
    int     value = 55;

    value &gt;&gt; str;

    printf( &quot;%s\n&quot;, str.getText() );

    return 0;
}
</code></pre>
<p>Ist der Prototyp STRING &amp;operator &gt;&gt; ( long value, STRING &amp;destination ); <strong>nach</strong> der Inlinefunktion, kracht es. So wie hier jedoch nicht.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1954411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1954411</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Sun, 19 Sep 2010 15:13:23 GMT</pubDate></item></channel></rss>