<?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&amp;lt;&amp;lt; Problem mit stream]]></title><description><![CDATA[<p>Guten Abend, Community!</p>
<p>Ich habe mich in den letzten Stunden durch einige Foren gewühlt, um in einem Programm, dass ich gerade schreibe, den &lt;&lt;-Operator für ein Objekt einer eigenen Klasse verwenden zu können. Nun, nachdem ich stundenlang das &quot;operator&lt;&lt;(std::ostream&amp;, const Spielkarte&amp;)' must take exactly one argument&quot; auszumerzen probiert habe (hat auch geklappt), besteht nun ein anderes Problem, das mich wahnsinnig macht...<br />
Aber hier zuerst der relevante Code.</p>
<p>Spielkarte.h</p>
<pre><code class="language-cpp">#ifndef SPIELKARTE_H
#define SPIELKARTE_H

#include &lt;string&gt;

using namespace std;

class Spielkarte
{
      public: enum Kartentyp
              {
                   GOTT,
                   ELEMENT,
                   MOB,
                   TOD,
                   KRIEG,
                   CHARAKTER
              };

              Spielkarte(string name, Kartentyp typ, string beschreibung);
              Spielkarte();
              ~Spielkarte();

              string name;
              Kartentyp typ;
              string beschreibung;

      friend ostream&amp; operator&lt;&lt; (ostream &amp;out, const Spielkarte &amp;karte);
};

#endif
</code></pre>
<p>Spielkarte.cpp</p>
<pre><code class="language-cpp">#include &quot;Spielkarte.h&quot;

Spielkarte::Spielkarte(string name, Kartentyp typ, string beschreibung)
{
     this-&gt;name = name;
     this-&gt;typ = typ;
     this-&gt;beschreibung = beschreibung;
}

Spielkarte::Spielkarte()
{
}

Spielkarte::~Spielkarte()
{
}

ostream&amp; operator&lt;&lt; (ostream &amp;out, const Spielkarte &amp;karte)
{
     out &lt;&lt; karte.name &lt;&lt; &quot;, &quot; &lt;&lt; karte.typ &lt;&lt; &quot;, &quot; &lt;&lt; karte.beschreibung;

     return out;
}
</code></pre>
<p>Das Problem sieht mein Compiler (Dev-C++ mit mingw) in der zuletzt aufgeführten Funktion operator&lt;&lt;<br />
In function `std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const Spielkarte&amp;)':<br />
20: no match for 'operator&lt;&lt;' in 'std::operator&lt;&lt; [with _CharT = char, _Traits = std::char_traits&lt;char&gt;, _Alloc = std::allocator&lt;char&gt;](((std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)(+out)), ((const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;&amp;)((const std::string*)karte))) &lt;&lt; &quot;, &quot;'<br />
19: note: candidates are: std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const Spielkarte&amp;)</p>
<p>Wenn ich das also gerade richtig verstehe, probiert er meinen soeben definierten Operator &lt;&lt; anzuwenden... anstatt eines einfachen Operators, wie er halt benutzt wird.</p>
<p>Also habe ich mal ein bisschen mit Zeile 20 rumgespielt und folgendes hinbekommen:</p>
<p>Wenn ich in Zeile 20 nur</p>
<pre><code class="language-cpp">out &lt;&lt; karte.name;
</code></pre>
<p>schreibe, gehts.<br />
Auch wenn ich</p>
<pre><code class="language-cpp">out &lt;&lt; karte.beschreibung;
</code></pre>
<p>schreibe, funktioniert es.</p>
<p>Doch sobald ich den enum oder auch nur so ein einfaches string-Konstrukt wie &quot;, &quot; (zur Abtrennung der einzelnen Werte) einbaue, geht das Ganze höllisch schief.</p>
<p>Liebe Community:</p>
<p>Woran liegt dies?</p>
<p>Oder liegt doch ein Compilerproblem vor, sodass Dev-C++ Schuld ist?</p>
<p>Ich danke euch für Hilfe ._.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/259637/operator-lt-lt-problem-mit-stream</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 18:54:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/259637.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 Jan 2010 21:23:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; Problem mit stream on Mon, 25 Jan 2010 21:23:43 GMT]]></title><description><![CDATA[<p>Guten Abend, Community!</p>
<p>Ich habe mich in den letzten Stunden durch einige Foren gewühlt, um in einem Programm, dass ich gerade schreibe, den &lt;&lt;-Operator für ein Objekt einer eigenen Klasse verwenden zu können. Nun, nachdem ich stundenlang das &quot;operator&lt;&lt;(std::ostream&amp;, const Spielkarte&amp;)' must take exactly one argument&quot; auszumerzen probiert habe (hat auch geklappt), besteht nun ein anderes Problem, das mich wahnsinnig macht...<br />
Aber hier zuerst der relevante Code.</p>
<p>Spielkarte.h</p>
<pre><code class="language-cpp">#ifndef SPIELKARTE_H
#define SPIELKARTE_H

#include &lt;string&gt;

using namespace std;

class Spielkarte
{
      public: enum Kartentyp
              {
                   GOTT,
                   ELEMENT,
                   MOB,
                   TOD,
                   KRIEG,
                   CHARAKTER
              };

              Spielkarte(string name, Kartentyp typ, string beschreibung);
              Spielkarte();
              ~Spielkarte();

              string name;
              Kartentyp typ;
              string beschreibung;

      friend ostream&amp; operator&lt;&lt; (ostream &amp;out, const Spielkarte &amp;karte);
};

#endif
</code></pre>
<p>Spielkarte.cpp</p>
<pre><code class="language-cpp">#include &quot;Spielkarte.h&quot;

Spielkarte::Spielkarte(string name, Kartentyp typ, string beschreibung)
{
     this-&gt;name = name;
     this-&gt;typ = typ;
     this-&gt;beschreibung = beschreibung;
}

Spielkarte::Spielkarte()
{
}

Spielkarte::~Spielkarte()
{
}

ostream&amp; operator&lt;&lt; (ostream &amp;out, const Spielkarte &amp;karte)
{
     out &lt;&lt; karte.name &lt;&lt; &quot;, &quot; &lt;&lt; karte.typ &lt;&lt; &quot;, &quot; &lt;&lt; karte.beschreibung;

     return out;
}
</code></pre>
<p>Das Problem sieht mein Compiler (Dev-C++ mit mingw) in der zuletzt aufgeführten Funktion operator&lt;&lt;<br />
In function `std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const Spielkarte&amp;)':<br />
20: no match for 'operator&lt;&lt;' in 'std::operator&lt;&lt; [with _CharT = char, _Traits = std::char_traits&lt;char&gt;, _Alloc = std::allocator&lt;char&gt;](((std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)(+out)), ((const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;&amp;)((const std::string*)karte))) &lt;&lt; &quot;, &quot;'<br />
19: note: candidates are: std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const Spielkarte&amp;)</p>
<p>Wenn ich das also gerade richtig verstehe, probiert er meinen soeben definierten Operator &lt;&lt; anzuwenden... anstatt eines einfachen Operators, wie er halt benutzt wird.</p>
<p>Also habe ich mal ein bisschen mit Zeile 20 rumgespielt und folgendes hinbekommen:</p>
<p>Wenn ich in Zeile 20 nur</p>
<pre><code class="language-cpp">out &lt;&lt; karte.name;
</code></pre>
<p>schreibe, gehts.<br />
Auch wenn ich</p>
<pre><code class="language-cpp">out &lt;&lt; karte.beschreibung;
</code></pre>
<p>schreibe, funktioniert es.</p>
<p>Doch sobald ich den enum oder auch nur so ein einfaches string-Konstrukt wie &quot;, &quot; (zur Abtrennung der einzelnen Werte) einbaue, geht das Ganze höllisch schief.</p>
<p>Liebe Community:</p>
<p>Woran liegt dies?</p>
<p>Oder liegt doch ein Compilerproblem vor, sodass Dev-C++ Schuld ist?</p>
<p>Ich danke euch für Hilfe ._.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1844812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1844812</guid><dc:creator><![CDATA[Nespar]]></dc:creator><pubDate>Mon, 25 Jan 2010 21:23:43 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; Problem mit stream on Mon, 25 Jan 2010 22:24:56 GMT]]></title><description><![CDATA[<p>Nespar schrieb:</p>
<blockquote>
<p>Oder liegt doch ein Compilerproblem vor, sodass Dev-C++ Schuld ist?</p>
</blockquote>
<p>Sorry, ich bin zu müde um jetzt den Rest durchzulesen, aber Dev-C++ solltest du wechseln (Kostenlose, aktuelle Alternativen sind u.a. Visual C++ Express 2008 oder Code::Blocks).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1844834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1844834</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 25 Jan 2010 22:24:56 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; Problem mit stream on Tue, 26 Jan 2010 08:05:21 GMT]]></title><description><![CDATA[<p>Der operator&lt;&lt; für const char * (also für die Stringliterale) ist nicht in &lt;string&gt; zu finden. Da fehlen die nötigen Includes.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1844891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1844891</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 26 Jan 2010 08:05:21 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; Problem mit stream on Tue, 26 Jan 2010 08:16:01 GMT]]></title><description><![CDATA[<blockquote>
<p>Woran liegt dies?</p>
<p>Oder liegt doch ein Compilerproblem vor, sodass Dev-C++ Schuld ist?</p>
</blockquote>
<p>An dir ;).</p>
<p>Ich habe dir deinen Quelltext etwas umgeschrieben, ein paar Kleinigkeiten hinzugefügt, weggelassen.</p>
<p>Sieh dir am besten mal die Unterschiede an. Wenn du Fragen hast, suche zuerst hier im Forum. Es gibt einen hervoragenden Beitrag zum Thema Operatorüberladung, weshalb ich das hier nicht erneut anspreche.</p>
<p>Weitere interessante Themen sind (auf deinen Post bezogen):</p>
<ul>
<li>struct, class, union</li>
<li>namespaces und wann man using vermeiden sollte</li>
<li>Konstruktoren, Funktionen mit Default-Parametern</li>
<li>Konstruktoren und Intitialisierungslisten</li>
<li>Friends und wann man sie nicht benötigt</li>
</ul>
<p>&lt;&lt;<a href="http://main.cc" rel="nofollow">main.cc</a>&gt;&gt;</p>
<pre><code class="language-cpp">#include &quot;spielkarte.h&quot;
#include &lt;iostream&gt;
using namespace std;

int main()
    {
        using namespace cppde;
        Spielkarte karte(Spielkarte::ELEMENT, &quot;Wasser&quot;, &quot;Blubb&quot;);
        cout &lt;&lt; karte &lt;&lt; endl;
    }
</code></pre>
<p>&lt;&lt;spielkarte.h&gt;&gt;</p>
<pre><code class="language-cpp">#if !defined(CPPDE_SPIELKARTE_H__INCLUDED)
#define CPPDE_SPIELKARTE_H__INCLUDED

#include &lt;string&gt;
#include &lt;ostream&gt; // casus knackus

namespace cppde {

struct Spielkarte
{
    enum Typ { NONE, GOTT, ELEMENT, MOB, TOD, KRIEG, CHARAKTER };

    Typ typ;
    std::string name;
    std::string beschreibung;

    Spielkarte(Typ typ=NONE, const std::string&amp; name=&quot;&quot;,
               const std::string&amp; beschreibung=&quot;&quot;);
};

} // -- namespace cppde --

std::ostream&amp; operator&lt;&lt;(std::ostream&amp; out, const cppde::Spielkarte&amp; karte);

#endif
</code></pre>
<p>&lt;&lt;<a href="http://spielkarte.cc" rel="nofollow">spielkarte.cc</a>&gt;&gt;</p>
<pre><code class="language-cpp">#include &quot;spielkarte.h&quot;
using namespace cppde;
using std::string;
using std::ostream;

Spielkarte::Spielkarte(Typ typ, const string&amp; name, const string&amp; beschreibung)
    : typ(typ), name(name), beschreibung(beschreibung)
    { }

ostream&amp; operator&lt;&lt;(ostream&amp; out, const Spielkarte&amp; karte)
    {
        out &lt;&lt; karte.name &lt;&lt; &quot;, &quot; &lt;&lt; karte.typ &lt;&lt; &quot;, &quot; &lt;&lt; karte.beschreibung;
        return out;
    }
</code></pre>
<p>Grüße ... Heiko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1844897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1844897</guid><dc:creator><![CDATA[bwbg]]></dc:creator><pubDate>Tue, 26 Jan 2010 08:16:01 GMT</pubDate></item><item><title><![CDATA[Reply to operator&amp;lt;&amp;lt; Problem mit stream on Tue, 26 Jan 2010 09:36:03 GMT]]></title><description><![CDATA[<p>Und weil es so viel Spaß macht:<br />
Im Header benutzt du den ostream ja gar nicht! Da ist der include des ostream unnötig. Du brauchst ja nur ne forward-declaration!<br />
Ersetze deshalb im Header #include &lt;ostream&gt; durch #include &lt;iosfwd&gt;.<br />
Das sorgt für schnelleres Kompilieren <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="🙂"
    /><br />
Du brauchst dann natürlich das #include &lt;ostream&gt; in deinem spielkarte.cpp, da dort auch die Klasse benutzt wird, da reicht eine Klassendeklaration nicht, da brauchst du die Definition!</p>
<p>Ansonsten (zum Ursprungspost):<br />
BITTE keine &quot;using namespace XYZ;&quot; im Header! Damit wird in jeder Datei, wo dein Header includet wird, der Namespace komplett sichtbar und du kannst voll in Namenskollisionen laufen - und brauchst ewig herauszufinden warum <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/1844938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1844938</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 26 Jan 2010 09:36:03 GMT</pubDate></item></channel></rss>