<?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[Problem: operator&amp;lt;&amp;lt;]]></title><description><![CDATA[<pre><code class="language-cpp">class Base{
public:
  Base&amp; operator&lt;&lt;(const int&amp; rhs) { /*blabla*/ return *this; }
};

class Derived : public Base{
public:
  Derived &amp; operator&lt;&lt;(const std::string&amp; rhs) { /*blabla*/ return *this; }

  using Base::operator&lt;&lt;;
};

int main(){
   Derived b;
   b &lt;&lt; &quot;hallo&quot; &lt;&lt; 1; //funzt
   b &lt;&lt; 1 &lt;&lt; &quot;hallo&quot;; //funzt nicht, weil er eine Base-Referenz nach b &lt;&lt; 1 zurück gibt

   return 0;
}
</code></pre>
<p>Wie kann man das Problem lösen OHNE alle Operatoren in der abgeleiteten Klasse erneut zu implementieren?</p>
<p>Sowas möchte ich natürlich umgehenst vermeiden:</p>
<pre><code class="language-cpp">Derived &amp; operator&lt;&lt;(const int&amp; rhs) 
{ 
   return dynamic_cast&lt;Derived&amp;&gt;Base::operator&lt;&lt;( rhs ); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/277021/problem-operator-lt-lt</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 03:01:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277021.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 11 Nov 2010 16:05:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem: operator&amp;lt;&amp;lt; on Thu, 11 Nov 2010 16:05:24 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Base{
public:
  Base&amp; operator&lt;&lt;(const int&amp; rhs) { /*blabla*/ return *this; }
};

class Derived : public Base{
public:
  Derived &amp; operator&lt;&lt;(const std::string&amp; rhs) { /*blabla*/ return *this; }

  using Base::operator&lt;&lt;;
};

int main(){
   Derived b;
   b &lt;&lt; &quot;hallo&quot; &lt;&lt; 1; //funzt
   b &lt;&lt; 1 &lt;&lt; &quot;hallo&quot;; //funzt nicht, weil er eine Base-Referenz nach b &lt;&lt; 1 zurück gibt

   return 0;
}
</code></pre>
<p>Wie kann man das Problem lösen OHNE alle Operatoren in der abgeleiteten Klasse erneut zu implementieren?</p>
<p>Sowas möchte ich natürlich umgehenst vermeiden:</p>
<pre><code class="language-cpp">Derived &amp; operator&lt;&lt;(const int&amp; rhs) 
{ 
   return dynamic_cast&lt;Derived&amp;&gt;Base::operator&lt;&lt;( rhs ); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1979022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979022</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Thu, 11 Nov 2010 16:05:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: operator&amp;lt;&amp;lt; on Thu, 11 Nov 2010 16:08:15 GMT]]></title><description><![CDATA[<p>Template vielleicht... ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979024</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Thu, 11 Nov 2010 16:08:15 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: operator&amp;lt;&amp;lt; on Thu, 11 Nov 2010 16:11:05 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

class Base{
public:
	template &lt;typename T&gt;
  Base&amp; operator&lt;&lt;(const T&amp; rhs) { /*blabla*/ return *this; }
};

class Derived : public Base{
public:
	template &lt;typename T&gt;
  Derived &amp; operator&lt;&lt;(const T&amp; rhs) { /*blabla*/ return *this; }

  using Base::operator&lt;&lt;;
};

int main()
{
   Derived b;
   b &lt;&lt; &quot;hallo&quot; &lt;&lt; 1; //funzt
   b &lt;&lt; 1 &lt;&lt; &quot;hallo&quot;; //funzt nicht, weil er eine Base-Referenz nach b &lt;&lt; 1 zurück gibt

   return 0;
}
</code></pre>
<p>Tätätääää</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979027</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Thu, 11 Nov 2010 16:11:05 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: operator&amp;lt;&amp;lt; on Thu, 11 Nov 2010 16:20:41 GMT]]></title><description><![CDATA[<p>Das beste, was mir dazu einfällt, ist die curiously recurring template pattern, d.h.</p>
<pre><code class="language-cpp">template&lt;typename actual_t&gt;
class base {
  actual_t &amp;operator&lt;&lt;(int x) { /* ... */ return static_cast&lt;actual_t&amp;&gt;(*this); }
};

class derived : public base&lt;derived&gt; {
  // ...
};
</code></pre>
<p>Insgesamt ist das kein Problem, dass sich über objektorientierte Polymorphie lösen lässt. Nimm beispielsweise</p>
<pre><code class="language-cpp">void foo(Base &amp;bar) {
  bar &lt;&lt; 1 &lt;&lt; &quot;foo&quot;;
}
</code></pre>
<p>...und schmeiß da ein Objekt einer zur Laufzeit ausgewählten, von Base abgeleiteten Klasse rein. Woher soll der Compiler wissen, ob die abgeleitete Klasse den String-Operator überhaupt hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979036</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 11 Nov 2010 16:20:41 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: operator&amp;lt;&amp;lt; on Thu, 11 Nov 2010 16:20:49 GMT]]></title><description><![CDATA[<p>Der Ansatz ist verkehrt.<br />
Was willst du denn erreichen damit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979037</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 11 Nov 2010 16:20:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: operator&amp;lt;&amp;lt; on Thu, 11 Nov 2010 16:26:55 GMT]]></title><description><![CDATA[<p>Hi shadow</p>
<pre><code class="language-cpp">class Base{
public:
	virtual	  ~Base() {}

	template&lt; typename T &gt;
	Base&amp; operator&lt;&lt;( const T&amp; t )	{ os &lt;&lt; &quot;örx&quot;; return *this; }; 

	Base&amp; operator&lt;&lt;(const int&amp; rhs)     { os &lt;&lt; rhs; return *this; }
	Base&amp; operator&lt;&lt;(const double &amp; rhs) { os &lt;&lt; rhs; return *this; }

	void print() 	{ std::cout &lt;&lt; os.str() &lt;&lt; std::endl; 	}
public:
	std::ostringstream os;
};

class Derived : public Base{
public:
	//Derived &amp; operator&lt;&lt;(const std::wstring&amp; rhs) { os &lt;&lt; rhs; return *this; }
	Derived &amp; operator&lt;&lt;(const std::string&amp; rhs)  { os &lt;&lt; rhs; return *this; }
	Derived &amp; operator&lt;&lt;(const char* &amp; rhs)       { os &lt;&lt; rhs; return *this; }

	template&lt; typename T &gt;
	Derived &amp; operator&lt;&lt;( const T&amp; t ) { return dynamic_cast&lt;Derived&amp;&gt;( Base::operator&lt;&lt;( t ) ); }
	using Base::operator&lt;&lt;;
};
</code></pre>
<p>also so geht das def nicht.<br />
jedenfalls stellt die klasse ein archiv da. in der basisklasse sollen alle fundamentalen datentypen behandelt werden und in den speziellen eben spezielle klassen. aber man möchte ein casten vermeiden, so dass sowas immer geht:</p>
<pre><code class="language-cpp">Derived d;
d &lt;&lt; fundamental &lt;&lt; speziell &lt;&lt; speziell &lt;&lt; fundamental ;
</code></pre>
<p>letztelich fügt man immer eine grosse anzahl an elementen an...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979042</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Thu, 11 Nov 2010 16:26:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: operator&amp;lt;&amp;lt; on Thu, 11 Nov 2010 18:32:10 GMT]]></title><description><![CDATA[<p>Was genau stellt Base denn da? Eine Art Serialisierung?</p>
<p>Ich wuerde den operator&lt;&lt; einfach aus der Klasse rausziehen, er fuehlt sich dort eh nicht gut an. Alternativ wie seldon gesagt hat: CRTP.</p>
<p>Prinzipiell will man aber hier eine Trennung zwischen der Klasse die die Daten speichert und den Operatoren des einfuegens. Meistens macht man es so, dass die Klasse die in das Archiv eingefuegt wird die Operation selber unterstuetzen muss. Da das manchmal unpraktisch ist, laesst man eine 3. Entitaet das Uebernehmen.</p>
<p>Hier ist es zB simpel: einfach den operator&lt;&lt; als freie Funktion definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979107</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 11 Nov 2010 18:32:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem: operator&amp;lt;&amp;lt; on Thu, 11 Nov 2010 21:10:53 GMT]]></title><description><![CDATA[<p>ja, allerdings ist das nicht mein code <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>in boost bzw der rcf von jarl lindrud mache ich es ebenfalls so. jede klasse serialisiert sich selbst... aber das geht hier eben nicht.</p>
<p>ich schau einfach mal, wie ich es am besten hinbekomme... danke erstmal</p>
<p>vermutlich werde ich das curiously recurring template pattern anwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1979182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1979182</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Thu, 11 Nov 2010 21:10:53 GMT</pubDate></item></channel></rss>