<?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 überladen und templates]]></title><description><![CDATA[<p>hallo zusammen,</p>
<p>ich habe eine templateklasse reference, welche eine anzahl von operatoren überlädt.</p>
<pre><code>template &lt;typename T&gt;
        class Reference {
            template &lt;typename S&gt;
            friend std::ostream &amp; operator&lt;&lt;(std::ostream &amp; stream, const Reference&lt;S&gt; &amp; ref);
        public:
            Reference();
            Reference(const T &amp; value);
            Reference(const Reference&lt;T&gt; &amp; orig);
            virtual ~Reference();
            Reference&lt;T&gt; &amp; operator=(const Reference&lt;T&gt; &amp; rhs);
            Reference&lt;T&gt; operator+(const unsigned int &amp; rhs);
            Reference&lt;T&gt; operator+(const Reference&lt;T&gt; &amp; rhs);
            Reference&lt;T&gt; operator-(const Reference&lt;T&gt; &amp; rhs);
            Reference&lt;T&gt; operator*(const unsigned int &amp; rhs);
            bool operator==(const Reference&lt;T&gt; &amp; rhs) const;
            bool operator!=(const Reference&lt;T&gt; &amp; rhs) const;
            bool operator&lt;(const Reference&lt;T&gt; &amp; rhs) const;
            bool operator&gt;(const Reference&lt;T&gt; &amp; rhs) const;
            //++a
            Reference&lt;T&gt; &amp; operator++();
            //a++
            Reference&lt;T&gt; operator++(int);
            void set(Archive &amp;archive);
            virtual T getValue() const;
        protected:
            T value;
        };
</code></pre>
<p>Eine Reference als solches ist sowas wie eine PeerID, eine Transaktionsnummer oder eine MessageReference. Dann habe ich eine Klasse MessageReference, welche eine Reference ist.</p>
<pre><code>class MessageReference : public Reference&lt;unsigned int&gt;  {
            friend std::ostream &amp; operator&lt;&lt;(std::ostream &amp; stream, const MessageReference &amp; mRef);
        public:
            MessageReference();
            MessageReference(MessageReference const &amp; orig);
            MessageReference(PeerID peerID, unsigned int sequ);
            virtual ~MessageReference();
            PeerID getPeerID();
            void setPeerID(PeerID peerID);
            int getSequenceNumber();
            void setSequenceNumber(int sequ);
            MessageReference &amp; operator=(const MessageReference &amp; rhs);
            bool operator==(const MessageReference &amp; o);
            //++a
            MessageReference&amp; operator++();
            //a++
            void operator++(int);
        private:
            static const unsigned int MessageReferencePeerIDOffset = 100000;
        };
</code></pre>
<p>In der Überladung des operators++ mach ich folgendes:</p>
<pre><code>MessageReference&amp;
        MessageReference::operator++(){

            value= MessageReferencePeerIDOffset * getPeerID() + getSequenceNumber() + 1;
            return *this;

        }
</code></pre>
<p>Dies führt zu folgenden Fehler:</p>
<pre><code>common/transport/MessageReference.cc: In member function 
'MessageReference&amp; MessageReference::operator++()’:
common/transport/MessageReference.cc:111: error: no match for ‘operator*’ in ‘MessageReference::MessageReferencePeerIDOffset * MessageReference::getPeerID()()’
libs/inet/src/util/uint128.h:286: note: candidates are: Uint128 operator*(const Uint128&amp;, const Uint128&amp;)
/opt/omnetpp-4.2.2/include/simtime.h:269: note:                 const SimTime operator*(double, const SimTime&amp;)
/opt/omnetpp-4.2.2/include/simtime.h:264: note:                 const SimTime operator*(const SimTime&amp;, double)
</code></pre>
<p>Ändere ich die Methode in:</p>
<pre><code>value= MessageReferencePeerIDOffset * getPeerID().getValue() + getSequenceNumber() + 1;
</code></pre>
<p>geht es. Kann mir jemand verraten, wie ich die Operatoren korrekt definiere/deklariere damit diese Variante überflüssig ist?</p>
<p>Schon mal dank.</p>
<p>sven_</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323674/operator-überladen-und-templates</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 20:04:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323674.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 10 Feb 2014 11:23:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator überladen und templates on Mon, 10 Feb 2014 11:23:43 GMT]]></title><description><![CDATA[<p>hallo zusammen,</p>
<p>ich habe eine templateklasse reference, welche eine anzahl von operatoren überlädt.</p>
<pre><code>template &lt;typename T&gt;
        class Reference {
            template &lt;typename S&gt;
            friend std::ostream &amp; operator&lt;&lt;(std::ostream &amp; stream, const Reference&lt;S&gt; &amp; ref);
        public:
            Reference();
            Reference(const T &amp; value);
            Reference(const Reference&lt;T&gt; &amp; orig);
            virtual ~Reference();
            Reference&lt;T&gt; &amp; operator=(const Reference&lt;T&gt; &amp; rhs);
            Reference&lt;T&gt; operator+(const unsigned int &amp; rhs);
            Reference&lt;T&gt; operator+(const Reference&lt;T&gt; &amp; rhs);
            Reference&lt;T&gt; operator-(const Reference&lt;T&gt; &amp; rhs);
            Reference&lt;T&gt; operator*(const unsigned int &amp; rhs);
            bool operator==(const Reference&lt;T&gt; &amp; rhs) const;
            bool operator!=(const Reference&lt;T&gt; &amp; rhs) const;
            bool operator&lt;(const Reference&lt;T&gt; &amp; rhs) const;
            bool operator&gt;(const Reference&lt;T&gt; &amp; rhs) const;
            //++a
            Reference&lt;T&gt; &amp; operator++();
            //a++
            Reference&lt;T&gt; operator++(int);
            void set(Archive &amp;archive);
            virtual T getValue() const;
        protected:
            T value;
        };
</code></pre>
<p>Eine Reference als solches ist sowas wie eine PeerID, eine Transaktionsnummer oder eine MessageReference. Dann habe ich eine Klasse MessageReference, welche eine Reference ist.</p>
<pre><code>class MessageReference : public Reference&lt;unsigned int&gt;  {
            friend std::ostream &amp; operator&lt;&lt;(std::ostream &amp; stream, const MessageReference &amp; mRef);
        public:
            MessageReference();
            MessageReference(MessageReference const &amp; orig);
            MessageReference(PeerID peerID, unsigned int sequ);
            virtual ~MessageReference();
            PeerID getPeerID();
            void setPeerID(PeerID peerID);
            int getSequenceNumber();
            void setSequenceNumber(int sequ);
            MessageReference &amp; operator=(const MessageReference &amp; rhs);
            bool operator==(const MessageReference &amp; o);
            //++a
            MessageReference&amp; operator++();
            //a++
            void operator++(int);
        private:
            static const unsigned int MessageReferencePeerIDOffset = 100000;
        };
</code></pre>
<p>In der Überladung des operators++ mach ich folgendes:</p>
<pre><code>MessageReference&amp;
        MessageReference::operator++(){

            value= MessageReferencePeerIDOffset * getPeerID() + getSequenceNumber() + 1;
            return *this;

        }
</code></pre>
<p>Dies führt zu folgenden Fehler:</p>
<pre><code>common/transport/MessageReference.cc: In member function 
'MessageReference&amp; MessageReference::operator++()’:
common/transport/MessageReference.cc:111: error: no match for ‘operator*’ in ‘MessageReference::MessageReferencePeerIDOffset * MessageReference::getPeerID()()’
libs/inet/src/util/uint128.h:286: note: candidates are: Uint128 operator*(const Uint128&amp;, const Uint128&amp;)
/opt/omnetpp-4.2.2/include/simtime.h:269: note:                 const SimTime operator*(double, const SimTime&amp;)
/opt/omnetpp-4.2.2/include/simtime.h:264: note:                 const SimTime operator*(const SimTime&amp;, double)
</code></pre>
<p>Ändere ich die Methode in:</p>
<pre><code>value= MessageReferencePeerIDOffset * getPeerID().getValue() + getSequenceNumber() + 1;
</code></pre>
<p>geht es. Kann mir jemand verraten, wie ich die Operatoren korrekt definiere/deklariere damit diese Variante überflüssig ist?</p>
<p>Schon mal dank.</p>
<p>sven_</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2382472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382472</guid><dc:creator><![CDATA[sven_]]></dc:creator><pubDate>Mon, 10 Feb 2014 11:23:43 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen und templates on Mon, 10 Feb 2014 12:30:46 GMT]]></title><description><![CDATA[<p>Wie wäre es wenn du uns<br />
1. Den <strong>echten</strong> Code zeigst, denn <code>MessageReference::getPeerID()()</code> sehe ich nirgends in deinen Code-Schnipseln,<br />
2. Die Definition der entscheidenden Klasse <code>PeerID</code> zeigst.</p>
<p>Wahrscheinlich willst du einen Konvertierungsoperator. Oder vielleicht auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2382486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382486</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 10 Feb 2014 12:30:46 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen und templates on Mon, 10 Feb 2014 12:40:17 GMT]]></title><description><![CDATA[<p>ausserdem: was bringt ein postinkrementoperator der nichts zurückgibt? da kann man ja gleich den präinkrementoperator aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2382487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382487</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 10 Feb 2014 12:40:17 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen und templates on Mon, 10 Feb 2014 12:42:09 GMT]]></title><description><![CDATA[<p>Hallo Arcoth,</p>
<p>vielen Dank für deine Antwort. PeerID ist nix weiter, außer:</p>
<pre><code>class PeerID : public Reference&lt;unsigned int&gt; {
        public:

            PeerID() : Reference&lt;unsigned int&gt;(0) {
            }

            PeerID(unsigned int data) : Reference&lt;unsigned int&gt;(data) {
            }
        };

        static const PeerID UNDEFINED_PEER_ID = 0;
        static const PeerID INITIAL_PEER_ID = 1;
</code></pre>
<p>Es ist der echte Code. Oder willst du die Deklaration von MessageReference::getPeerID() ? Diese wäre:</p>
<pre><code>PeerID
        MessageReference::getPeerID() {
            return value / MessageReferencePeerIDOffset;
        }
</code></pre>
<p>Gruß<br />
sven_</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2382488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382488</guid><dc:creator><![CDATA[sven_]]></dc:creator><pubDate>Mon, 10 Feb 2014 12:42:09 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen und templates on Mon, 10 Feb 2014 12:46:47 GMT]]></title><description><![CDATA[<p>Ah, da ist also ein Fehler,</p>
<p>so habe ich erstmal die a++ definition geändert in:</p>
<pre><code>MessageReference
        MessageReference::operator++(int){

            MessageReference result(*this);
            result.value = MessageReferencePeerIDOffset * getPeerID().getValue() + getSequenceNumber() + 1;
            return result;            

        }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2382489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382489</guid><dc:creator><![CDATA[sven_]]></dc:creator><pubDate>Mon, 10 Feb 2014 12:46:47 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen und templates on Mon, 10 Feb 2014 12:49:43 GMT]]></title><description><![CDATA[<p>sven_ schrieb:</p>
<blockquote>
<p>Ah, da ist also ein Fehler,</p>
<p>so habe ich erstmal die a++ definition geändert in:</p>
<pre><code>MessageReference
        MessageReference::operator++(int){

            MessageReference result(*this);
            result.value = MessageReferencePeerIDOffset * getPeerID().getValue() + getSequenceNumber() + 1;
            return result;            

        }
</code></pre>
</blockquote>
<p>kleiner tipp: um rendundanz zu vermeiden greift man mit dem postinkrementoperator auf den präinkrementoperator zu. hat z.b. den vorteil, dass man allfällige fehler nur in einer version ausbessern muss:</p>
<pre><code>MessageReference
        MessageReference::operator++(int){

            MessageReference result(*this);
            ++(*this); // Hier
            return result;            

        }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2382490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382490</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 10 Feb 2014 12:49:43 GMT</pubDate></item><item><title><![CDATA[Reply to operator überladen und templates on Mon, 10 Feb 2014 13:40:55 GMT]]></title><description><![CDATA[<p>Hallo nochmal,</p>
<p>angenommen es gibt eine Klasse A, welche ein Member PeerID hat. Was ich nicht verstehe ist, dass wenn ich sowas mache:</p>
<pre><code>PeerID 
A::createPeerID(){
return aPeerIO++;
}
</code></pre>
<p>Ich folgenden Fehler erhalte:</p>
<pre><code>error: conversion from ‘Reference&lt;unsigned int&gt;’ to non-scalar type ‘ubeeme::moversight::PeerID’ requested
</code></pre>
<p>Was ist da falsch, an meiner Reference Klasse??</p>
<p>Danke nochmal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2382506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2382506</guid><dc:creator><![CDATA[sven_]]></dc:creator><pubDate>Mon, 10 Feb 2014 13:40:55 GMT</pubDate></item></channel></rss>