<?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 mit friend-Dekleration]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klasse innerhalb eines eigenen Namespaces deklariert. Für diese Klasse möchte ich den globalen Ausgabeoperator überladen. Dazu habe ich in der Klassendefinition die Friend-Deklaration hinzugefügt. Leider wird anscheinend diese Deklaration bei mir nich richtig erkannt und es kommt die Fehlermeldung, dass das Attribut &quot;var1&quot; der Klasse &quot;KlasseA&quot; als privat definiert ist und ich daher darauf nicht zugreifen kann.</p>
<p>Mein Beispiel besteht aus zwei Dateien.<br />
Die Header-Datei der Klasse &quot;KlasseA.h&quot;</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#ifndef KLASSEA_H_
#define KLASSEA_H_

namespace MyNamespace {
	class KlasseA{
		private:
			int var1;

		public:
			KlasseA();
			friend std::ostream &amp; operator&lt;&lt;( std::ostream&amp; strm, MyNamespace::KlasseA &amp; lsystem);
	};
}

std::ostream &amp; operator&lt;&lt;( std::ostream&amp; strm, MyNamespace::KlasseA &amp; lsystem);

#endif /* KLASSEA_H_ */
</code></pre>
<p>Und der Datei &quot;KlasseA.cpp&quot;, die die Funktionen dieser Klasse enthält:</p>
<pre><code class="language-cpp">#include &quot;KlasseA.h&quot;

using namespace MyNamespace;

KlasseA::KlasseA()
{
	this-&gt;var1 = 10;
}

std::ostream &amp; operator&lt;&lt;( std::ostream&amp; strm, MyNamespace::KlasseA &amp; lsystem)
{
	strm &lt;&lt; lsystem.var1 &lt;&lt; std::endl;
        return strm;
}
</code></pre>
<p>Als Compiler benutze ich den gcc.</p>
<p>Zu dem Thema globale Überladung eines Operators habe ich einige Einträge im Web gefunden (z.B. <a href="http://stackoverflow.com/questions/3312269/c-friend-function-operator-overloading-istream" rel="nofollow">http://stackoverflow.com/questions/3312269/c-friend-function-operator-overloading-istream</a> oder <a href="http://www.cplusplus.com/forum/beginner/13164/" rel="nofollow">http://www.cplusplus.com/forum/beginner/13164/</a>) Leider bin ich aus den Beiträgen nicht schlau geworden.</p>
<p>Wenn ich Definition des eigenen Namespaces weglasse, compiliert das Programm.<br />
Wie jedoch muss ich den Operator definieren, damit es auch mit einem eigenen Namespace klappt?</p>
<p>Viele Grüße,</p>
<p>ottixus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/294171/problem-mit-friend-dekleration</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 01:05:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/294171.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 Oct 2011 09:56:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit friend-Dekleration on Wed, 19 Oct 2011 10:25:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klasse innerhalb eines eigenen Namespaces deklariert. Für diese Klasse möchte ich den globalen Ausgabeoperator überladen. Dazu habe ich in der Klassendefinition die Friend-Deklaration hinzugefügt. Leider wird anscheinend diese Deklaration bei mir nich richtig erkannt und es kommt die Fehlermeldung, dass das Attribut &quot;var1&quot; der Klasse &quot;KlasseA&quot; als privat definiert ist und ich daher darauf nicht zugreifen kann.</p>
<p>Mein Beispiel besteht aus zwei Dateien.<br />
Die Header-Datei der Klasse &quot;KlasseA.h&quot;</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#ifndef KLASSEA_H_
#define KLASSEA_H_

namespace MyNamespace {
	class KlasseA{
		private:
			int var1;

		public:
			KlasseA();
			friend std::ostream &amp; operator&lt;&lt;( std::ostream&amp; strm, MyNamespace::KlasseA &amp; lsystem);
	};
}

std::ostream &amp; operator&lt;&lt;( std::ostream&amp; strm, MyNamespace::KlasseA &amp; lsystem);

#endif /* KLASSEA_H_ */
</code></pre>
<p>Und der Datei &quot;KlasseA.cpp&quot;, die die Funktionen dieser Klasse enthält:</p>
<pre><code class="language-cpp">#include &quot;KlasseA.h&quot;

using namespace MyNamespace;

KlasseA::KlasseA()
{
	this-&gt;var1 = 10;
}

std::ostream &amp; operator&lt;&lt;( std::ostream&amp; strm, MyNamespace::KlasseA &amp; lsystem)
{
	strm &lt;&lt; lsystem.var1 &lt;&lt; std::endl;
        return strm;
}
</code></pre>
<p>Als Compiler benutze ich den gcc.</p>
<p>Zu dem Thema globale Überladung eines Operators habe ich einige Einträge im Web gefunden (z.B. <a href="http://stackoverflow.com/questions/3312269/c-friend-function-operator-overloading-istream" rel="nofollow">http://stackoverflow.com/questions/3312269/c-friend-function-operator-overloading-istream</a> oder <a href="http://www.cplusplus.com/forum/beginner/13164/" rel="nofollow">http://www.cplusplus.com/forum/beginner/13164/</a>) Leider bin ich aus den Beiträgen nicht schlau geworden.</p>
<p>Wenn ich Definition des eigenen Namespaces weglasse, compiliert das Programm.<br />
Wie jedoch muss ich den Operator definieren, damit es auch mit einem eigenen Namespace klappt?</p>
<p>Viele Grüße,</p>
<p>ottixus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2133173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2133173</guid><dc:creator><![CDATA[ottixus]]></dc:creator><pubDate>Wed, 19 Oct 2011 10:25:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit friend-Dekleration on Wed, 19 Oct 2011 10:31:33 GMT]]></title><description><![CDATA[<p>Wie wär's hiermit?</p>
<pre><code class="language-cpp">friend std::ostream &amp; ::operator&lt;&lt;( std::ostream&amp; strm, MyNamespace::KlasseA &amp; lsystem);
</code></pre>
<p>Ist nur geraten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2133208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2133208</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Wed, 19 Oct 2011 10:31:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit friend-Dekleration on Wed, 19 Oct 2011 11:27:29 GMT]]></title><description><![CDATA[<p>Wenn ich die Friend-Deklaration so abändere, wie du vorgeschlagen hast, bekomme ich folgende Fehlermeldung:</p>
<p>error: ‘std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, MyNamespace::KlasseA&amp;)’ should have been declared inside ‘::’<br />
make: *** [src/KlasseA.o] Fehler 1</p>
<p>Die Fehlermeldung, dass das Attribut private ist, wird aber nicht mehr angezeigt. Ich vermute, weil der Compiler nun erst gar nicht soweit kommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2133236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2133236</guid><dc:creator><![CDATA[ottixus]]></dc:creator><pubDate>Wed, 19 Oct 2011 11:27:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit friend-Dekleration on Wed, 19 Oct 2011 11:38:06 GMT]]></title><description><![CDATA[<p>Das hier kompiliert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

namespace MyNamespace 
{
	class KlasseA;	
}

std::ostream&amp; operator&lt;&lt;(std::ostream&amp; strm, const MyNamespace::KlasseA&amp; lsystem);

namespace MyNamespace 
{
    class KlasseA
    {
        private:
            int var1;

        public:
            KlasseA(int x): var1(x) {}
            friend std::ostream&amp; ::operator&lt;&lt;(std::ostream&amp; strm, const KlasseA&amp; lsystem);
    };
}

std::ostream&amp; operator&lt;&lt;(std::ostream&amp; strm, const MyNamespace::KlasseA&amp; lsystem)
{
	strm &lt;&lt; lsystem.var1;
	return strm;
}

int main()
{
	MyNamespace::KlasseA a(1);
	std::cout &lt;&lt; a &lt;&lt; &quot;\n&quot;;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2133246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2133246</guid><dc:creator><![CDATA[__cu]]></dc:creator><pubDate>Wed, 19 Oct 2011 11:38:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit friend-Dekleration on Wed, 19 Oct 2011 11:49:22 GMT]]></title><description><![CDATA[<p>Warum muss dein operator&lt;&lt; global sein?<br />
Definiere ihn im Namespace, über ADL wird er gefunden.</p>
<p><a href="http://en.wikipedia.org/wiki/Argument-dependent_name_lookup" rel="nofollow">http://en.wikipedia.org/wiki/Argument-dependent_name_lookup</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2133260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2133260</guid><dc:creator><![CDATA[einwurf]]></dc:creator><pubDate>Wed, 19 Oct 2011 11:49:22 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit friend-Dekleration on Wed, 19 Oct 2011 12:27:53 GMT]]></title><description><![CDATA[<p>Der Quellcode von &quot;__cu&quot; kompiliert bei mir auch. Allerdings nur, wenn alles in einer Datei steht. Wenn ich den Code in Header und Cpp-Datei aufteile, erhalte ich den vorhin beschriebene Fehlermeldung, dass der Operator innerhalb des Namensraums von &quot;::&quot; deklariert werden sollte.</p>
<p>Wenn ich jedoch, wie &quot;einwurf&quot; vorgeschlagen hatte, den Operator innerhalb des Namespaces definiere, kompiliert er einwandfrei.</p>
<p>Vielen Dank für die Hilfe!</p>
<p>Der funktionsfähige Code sieht nun so aus:<br />
Headerdatei:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#ifndef KLASSEA_H_
#define KLASSEA_H_

namespace MyNamespace {
	class KlasseA{
		private:
			int var1;

		public:
			KlasseA();
			friend std::ostream &amp; MyNamespace::operator&lt;&lt;( std::ostream&amp; strm, const KlasseA &amp; lsystem);
	};

	std::ostream &amp; operator&lt;&lt;( std::ostream&amp; strm, const KlasseA &amp; lsystem);

}
</code></pre>
<p>KlasseA.cpp:</p>
<pre><code class="language-cpp">#include &quot;KlasseA.h&quot;

using namespace MyNamespace;

KlasseA::KlasseA()
{
	this-&gt;var1 = 10;
}

std::ostream &amp; MyNamespace::operator&lt;&lt;( std::ostream&amp; strm, const MyNamespace::KlasseA &amp; lsystem)
{
	strm &lt;&lt; lsystem.var1 &lt;&lt; std::endl;

	return strm;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2133276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2133276</guid><dc:creator><![CDATA[ottixus]]></dc:creator><pubDate>Wed, 19 Oct 2011 12:27:53 GMT</pubDate></item></channel></rss>