<?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[Spazialisierung von Forward Template Function als friend, WIE?!]]></title><description><![CDATA[<p>Hallo,</p>
<pre><code class="language-cpp">template&lt;typename Ty&gt;
    class property;

    template&lt;typename Ty&gt;
    std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, const property&lt;Ty&gt;&amp; value);

    template&lt;typename Ty&gt;
    class property: public property_base
    {
    public:
        friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, const property&lt;Ty&gt;&amp; value); // &lt;- zeile 56
    };
</code></pre>
<p>Funktioniert auf allen möglichen GCCs unter 4.0 mit folgender Warnung (Gibt Linkerfehler, aber das ist ja klar angesichts der Meldung):</p>
<pre><code>proctools/property.h:56: warning: friend declaration `std::ostream&amp;
   proctools::operator&lt;&lt;(std::ostream&amp;, const proctools::property&lt;Ty&gt;&amp;)'
   declares a non-template function
proctools/property.h:56: warning: (if this is not what you intended, make sure
   the function template has already been declared and add &lt;&gt; after the
   function name here) -Wno-non-template-friend disables this warning
</code></pre>
<p>Tu ich wie mir geheissen, schreibe also operator&lt;&lt; &lt;&gt;, compiliert's wunderbar und funktioniert auch, um genau zu sein seit zwei Wochen, aber nun gebe ich das raus, und als allererstes GEHT'S NICHT MEHR mit gcc 4.0 <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p>Kann mir nun einer sagen wie's heissen muss damit es auf ALLEN verfluchten GCCs läuft?!</p>
<p>EDIT:<br />
PS: Versucht habe ich natürlich schon alles mögliche, ich poste hier erst wenn ich schon kurz vorm Nervenzusammenbruch stehe <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>
<p>EDIT:<br />
Die GCC4 Fehlermeldung lautet:</p>
<pre><code>proctools/property.h:56: error: declaration of 'operator&lt;&lt;' as non-function
proctools/property.h:56: error: expected ';' before '&lt;' token
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/147365/spazialisierung-von-forward-template-function-als-friend-wie</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 03:32:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/147365.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 May 2006 10:21:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Spazialisierung von Forward Template Function als friend, WIE?! on Tue, 16 May 2006 10:38:58 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<pre><code class="language-cpp">template&lt;typename Ty&gt;
    class property;

    template&lt;typename Ty&gt;
    std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, const property&lt;Ty&gt;&amp; value);

    template&lt;typename Ty&gt;
    class property: public property_base
    {
    public:
        friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, const property&lt;Ty&gt;&amp; value); // &lt;- zeile 56
    };
</code></pre>
<p>Funktioniert auf allen möglichen GCCs unter 4.0 mit folgender Warnung (Gibt Linkerfehler, aber das ist ja klar angesichts der Meldung):</p>
<pre><code>proctools/property.h:56: warning: friend declaration `std::ostream&amp;
   proctools::operator&lt;&lt;(std::ostream&amp;, const proctools::property&lt;Ty&gt;&amp;)'
   declares a non-template function
proctools/property.h:56: warning: (if this is not what you intended, make sure
   the function template has already been declared and add &lt;&gt; after the
   function name here) -Wno-non-template-friend disables this warning
</code></pre>
<p>Tu ich wie mir geheissen, schreibe also operator&lt;&lt; &lt;&gt;, compiliert's wunderbar und funktioniert auch, um genau zu sein seit zwei Wochen, aber nun gebe ich das raus, und als allererstes GEHT'S NICHT MEHR mit gcc 4.0 <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p>Kann mir nun einer sagen wie's heissen muss damit es auf ALLEN verfluchten GCCs läuft?!</p>
<p>EDIT:<br />
PS: Versucht habe ich natürlich schon alles mögliche, ich poste hier erst wenn ich schon kurz vorm Nervenzusammenbruch stehe <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>
<p>EDIT:<br />
Die GCC4 Fehlermeldung lautet:</p>
<pre><code>proctools/property.h:56: error: declaration of 'operator&lt;&lt;' as non-function
proctools/property.h:56: error: expected ';' before '&lt;' token
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1058729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058729</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 16 May 2006 10:38:58 GMT</pubDate></item><item><title><![CDATA[Reply to Spazialisierung von Forward Template Function als friend, WIE?! on Tue, 16 May 2006 10:57:11 GMT]]></title><description><![CDATA[<p>Um mal ein Selbstgespräch zu führen, ich glaube ich habe mich bei der Lösung durch Folgefehler die nun widerum vom gcc 2.95.4 ausgespuckt werden irritieren lassen...</p>
<pre><code class="language-cpp">friend std::ostream&amp; operator&lt;&lt; &lt;Ty&gt;(std::ostream&amp; os, const property&lt;Ty&gt;&amp; value);
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>EDIT:<br />
Nein, laut VC8 (der einzige neuere Compiler neben dem gcc 3.2 den ich hier habe) ist das auch falsch:</p>
<pre><code>property.cpp(34) : error C2143: syntax error : missing ';' before '&lt;'
property.cpp(38) : see reference to class template instantiation 'property&lt;Ty&gt;' being compiled
property.cpp(34) : error C2433: '&lt;&lt;' : 'friend' not permitted on data declarations
property.cpp(34) : error C2365: 'operator &lt;&lt;' : redefinition; previous definition was 'function'
property.cpp(9) : see declaration of 'operator &lt;&lt;'
property.cpp(34) : error C2530: '&lt;&lt;' : references must be initialized
property.cpp(34) : error C2238: unexpected token(s) preceding ';'
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1058755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058755</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 16 May 2006 10:57:11 GMT</pubDate></item><item><title><![CDATA[Reply to Spazialisierung von Forward Template Function als friend, WIE?! on Tue, 16 May 2006 11:05:44 GMT]]></title><description><![CDATA[<p>Ich mag mich zwar irren, aber mitunter MUSST du dem Compiler wirklich dazusagen, daß er es mit Templates zu tun hat:</p>
<pre><code class="language-cpp">friend template&lt;&gt; ostream&amp; operator&lt;&lt;(...);
</code></pre>
<p>Oder du definierst den op&lt;&lt; erst, nachdem du die Klassendeklaration durch hast:</p>
<pre><code class="language-cpp">template&lt;typename Ty&gt;
class property
{
  friend ostream&amp; operator&lt;&lt;(ostream&amp;,const property&lt;Ty&gt;&amp;);//notfalls ohne das &lt;Ty&gt; probieren
  ...
};

template&lt;typename Ty&gt;
ostream&amp; operator&lt;&lt;(ostream&amp; sout,const property&lt;Ty&gt;&amp; data)
{
  ...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1058776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058776</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 16 May 2006 11:05:44 GMT</pubDate></item><item><title><![CDATA[Reply to Spazialisierung von Forward Template Function als friend, WIE?! on Tue, 16 May 2006 11:23:01 GMT]]></title><description><![CDATA[<p>Danke für den Hinweis, tatsächlich funktioniert es mit dem VC8 und dem gcc 4.0 (das war eines von &quot;versucht habe ich schon alles mögliche&quot;) folgendermassen (was mir auch eingängig scheint, denn es wird eine Template-Deklaration mit einem Parameter erwartet, und der Templateparameter wird durch das umgebende Klassentemplate besetzt).</p>
<pre><code class="language-cpp">template&lt;typename Ty&gt;
    class property;

    template&lt;typename Ty&gt;
    std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, const property&lt;Ty&gt;&amp; value);

    template&lt;typename Ty&gt;
    class property: public property_base
    {
    public:
	template&lt;typename&gt;
        friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, const property&amp; value);

    private:
        Ty m_value;
    };
</code></pre>
<p>Allerdings besteht der gcc 3.2 auf folgender Lösung (die aber mit zumindest dem VC8, hoffentlich auch mit dem gcc 4.0 funktioniert):</p>
<pre><code class="language-cpp">template&lt;typename Dummy&gt;
        friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, const property&lt;Dummy&gt;&amp; value);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1058790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058790</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 16 May 2006 11:23:01 GMT</pubDate></item><item><title><![CDATA[Reply to Spazialisierung von Forward Template Function als friend, WIE?! on Tue, 16 May 2006 12:14:08 GMT]]></title><description><![CDATA[<p>Letztere Lösung sollte auch die Richtige sein. Du wiederholst im friend ja die Deklaration vom operator&lt;&lt; - und die muss auch wieder ein Template sein. Dass die umschließende Klasse auch ein Template ist, spielt dabei erstmal keine Rolle - denn der friend gehört nicht zur Klasse (der friend schon, aber nicht die bezeichnete Funktion) und hängt auch nicht von deren Templateparametern ab. Demnach sollte dort auch die Template Name Injection nicht funktionieren (weshalb du nicht einfach property schreiben kannst, sondern property&lt;Dummy&gt; schreiben musst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058818</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Tue, 16 May 2006 12:14:08 GMT</pubDate></item></channel></rss>