<?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[Instanzmethode als friend deklarieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in einem Header-File folgenden Code:</p>
<pre><code class="language-cpp">...

class To_Dot_Str_Visitor;   // Zeile 23

...

class Prob_Nd : public virtual Rev_Nd, public virtual Base_Nd&lt;Rev_Nd, Rev_NC, Rev_Tree&gt;
{
	friend void To_Dot_Str_Visitor::_visit(Rev_Nd* n);   // Zeile 122
	...
}
</code></pre>
<p>Beim kompilieren erhalte ich nun die Fehlermeldung</p>
<pre><code class="language-cpp">../src/node/nd.h:122: Fehler: invalid use of incomplete type »struct To_Dot_Str_Visitor«
../src/node/nd.h:23: Fehler: forward declaration of »struct To_Dot_Str_Visitor«
</code></pre>
<p>Von daher die Frage: Gibt es hier andere Loesungsmoeglichkeiten als</p>
<ul>
<li>To_Dot_Str_Visitor als friend von Prob_Nd zu deklarieren</li>
<li>die Definition von To_Dot_Str_Visitor einzubinden</li>
</ul>
<p>?</p>
<p>Und im uebrigen: Warum braucht der Kompiler hier ueberhaupt den vollstaendigen Typ von To_Dot_Str_Visitor? Die Groesse von Prob_Nd laesst sich ja auch ohne dieses Wissens bestimmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242010/instanzmethode-als-friend-deklarieren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 05:06:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242010.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 28 May 2009 18:14:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Instanzmethode als friend deklarieren on Thu, 28 May 2009 18:16:44 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe in einem Header-File folgenden Code:</p>
<pre><code class="language-cpp">...

class To_Dot_Str_Visitor;   // Zeile 23

...

class Prob_Nd : public virtual Rev_Nd, public virtual Base_Nd&lt;Rev_Nd, Rev_NC, Rev_Tree&gt;
{
	friend void To_Dot_Str_Visitor::_visit(Rev_Nd* n);   // Zeile 122
	...
}
</code></pre>
<p>Beim kompilieren erhalte ich nun die Fehlermeldung</p>
<pre><code class="language-cpp">../src/node/nd.h:122: Fehler: invalid use of incomplete type »struct To_Dot_Str_Visitor«
../src/node/nd.h:23: Fehler: forward declaration of »struct To_Dot_Str_Visitor«
</code></pre>
<p>Von daher die Frage: Gibt es hier andere Loesungsmoeglichkeiten als</p>
<ul>
<li>To_Dot_Str_Visitor als friend von Prob_Nd zu deklarieren</li>
<li>die Definition von To_Dot_Str_Visitor einzubinden</li>
</ul>
<p>?</p>
<p>Und im uebrigen: Warum braucht der Kompiler hier ueberhaupt den vollstaendigen Typ von To_Dot_Str_Visitor? Die Groesse von Prob_Nd laesst sich ja auch ohne dieses Wissens bestimmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717471</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Thu, 28 May 2009 18:16:44 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzmethode als friend deklarieren on Thu, 28 May 2009 18:19:12 GMT]]></title><description><![CDATA[<p>Woher soll der Kompiler die friend-Funktion kennen. Aus der Forward-Deklaration sicher nicht. Die kann man nur benutzen, wenn man mit Zeiger oder Referenzen hantiert, aber keine &quot;Interna&quot; braucht. Ein #include &quot;To_Dot_Str_Visitor.h&quot; sollte abhilfe schaffen.</p>
<blockquote>
<p>die Definition von To_Dot_Str_Visitor einzubinden</p>
</blockquote>
<p>Du hast nichts definiert, nur deklariert. Deswegen ist der Typ auch unvollstaendig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717473</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 28 May 2009 18:19:12 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzmethode als friend deklarieren on Thu, 28 May 2009 18:22:09 GMT]]></title><description><![CDATA[<p>was hat <code>void To_Dot_Str_Visitor::_visit(Rev_Nd* n);</code> in den Eingeweiden von Prob_Nd zu schaffen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717474</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 28 May 2009 18:22:09 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzmethode als friend deklarieren on Fri, 29 May 2009 05:22:48 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>was hat <code>void To_Dot_Str_Visitor::_visit(Rev_Nd* n);</code> in den Eingeweiden von Prob_Nd zu schaffen?</p>
</blockquote>
<p>Es handelt sich dabei um eine Ausgabe-Funktion. Da sie Interna von Prob_Nd ausgeben soll (auf die ordinaere Funktionen keinen Zugriff haben), habe ich das mittels friend realisiert (so wie ich gewoehnlich auch den &lt;&lt;-Operator als friend deklariere).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1717638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717638</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Fri, 29 May 2009 05:22:48 GMT</pubDate></item><item><title><![CDATA[Reply to Instanzmethode als friend deklarieren on Fri, 29 May 2009 06:54:40 GMT]]></title><description><![CDATA[<p>ingobulla schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>was hat <code>void To_Dot_Str_Visitor::_visit(Rev_Nd* n);</code> in den Eingeweiden von Prob_Nd zu schaffen?</p>
</blockquote>
<p>Es handelt sich dabei um eine Ausgabe-Funktion. Da sie Interna von Prob_Nd ausgeben soll (auf die ordinaere Funktionen keinen Zugriff haben), habe ich das mittels friend realisiert (so wie ich gewoehnlich auch den &lt;&lt;-Operator als friend deklariere).</p>
</blockquote>
<p>Ahso, wunderte mich nur weil ein Rev_Nd* als Parameter übergeben wurde und kein Prob_Nd*.</p>
<p>Da friends die stärkste Bindung sind die es in C++ gibt und der op&lt;&lt; meist nicht Zugriff auf <em>alle</em> privaten Member braucht löse ich das meist so:</p>
<pre><code class="language-cpp">class X {
public: 
  ostream&amp; print(ostream&amp; os) const
  {
    /* output */
    return os;
  }
};

std::ostream&amp; operator&lt;&lt; (std::ostream&amp; os, X const&amp; rhs)
{
  return rhs.print(os);
}
</code></pre>
<p>bzw. mit einem kleinen vorgefertigten Template:</p>
<pre><code class="language-cpp">//printable.hpp
#include &lt;iosfwd&gt;
template &lt;class T&gt;
struct printable
{
  friend std::ostream&amp; operator&lt;&lt; (std::ostream&amp; os, T const&amp; t)
  { return t.print(os); }
};

//X.hpp
#include &quot;printable.hpp&quot;
class X : printable&lt;X&gt; 
{
public: 
  ostream&amp; print(ostream&amp; os) const
  {
    /* output */
    return os;
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1717676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1717676</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 29 May 2009 06:54:40 GMT</pubDate></item></channel></rss>