<?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[Einfaches Klassentemplate kompiliert nicht]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein Problem, ein einfaches Klassentemplate zum Kompilieren zu bekommen.<br />
Die Variante der Klasse mit festem Datentyp kompiliert.<br />
Wahrscheinlich ist es irgendwas total einfaches, aber ich hab jetzt schon ein paar Sachen ausprobiert und den Quelltext eigentlich auch 1:1 von einem angeblich funktionierenden Beispiel abgetippt (und dann später noch ein paar Sachen rausgenommen).<br />
Hier also der Code:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

template&lt;class T&gt;
class Point {
public:
    T x, y;
    //int x, y;
    Point();
    Point(T _X, T _Y);
    //Point(int _X, int _Y);
    //Point( const Point&amp; pt);
    ~Point();
    //Point&amp; operator=(const Point&amp; pt);
    //bool operator==(const Point&amp; pt) const;
};
Point::Point() : x(0), y(0) {}
//Point::Point(int X, int Y) : x(X), y(Y) {}
Point::Point(T X, T Y) : x(X), y(Y) {}
//Point::Point( const Point&amp; pt) : x(pt.x), y(pt.y) {}

Point::~Point() {}

int main() {
  cout &lt;&lt; &quot;!!!Hello World!!!&quot; &lt;&lt; endl; // prints !!!Hello World!!!
  Point&lt;int&gt; p; // = new Point(1,2);
  //Point* p  = new Point(1,2);
  return 0;
}
</code></pre>
<p>@Edit:<br />
Ach ja, die Fehlermeldung^^:</p>
<pre><code>test.cpp:20: error: ‘template&lt;class T&gt; class Point’ used without template parameters
test.cpp:20: error: ISO C++ forbids declaration of ‘Point’ with no type
test.cpp: In function ‘int Point()’:
test.cpp:20: error: ‘int Point()’ redeclared as different kind of symbol
test.cpp:6: error: previous declaration of ‘template&lt;class T&gt; class Point’
test.cpp:20: error: only constructors take base initializers
test.cpp: At global scope:
test.cpp:22: error: ‘template&lt;class T&gt; class Point’ used without template parameters
test.cpp:22: error: expected constructor, destructor, or type conversion before ‘(’ token
test.cpp:25: error: expected constructor, destructor, or type conversion before ‘::’ token
</code></pre>
<p>Ich verwende g++ 4.4.3.</p>
<p>Vielen Dank schonmal im Voraus für eure Hilfe <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="😉"
    /> ,<br />
Lukas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317225/einfaches-klassentemplate-kompiliert-nicht</link><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 06:13:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317225.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 31 May 2013 13:51:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Einfaches Klassentemplate kompiliert nicht on Fri, 31 May 2013 13:55:04 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein Problem, ein einfaches Klassentemplate zum Kompilieren zu bekommen.<br />
Die Variante der Klasse mit festem Datentyp kompiliert.<br />
Wahrscheinlich ist es irgendwas total einfaches, aber ich hab jetzt schon ein paar Sachen ausprobiert und den Quelltext eigentlich auch 1:1 von einem angeblich funktionierenden Beispiel abgetippt (und dann später noch ein paar Sachen rausgenommen).<br />
Hier also der Code:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

template&lt;class T&gt;
class Point {
public:
    T x, y;
    //int x, y;
    Point();
    Point(T _X, T _Y);
    //Point(int _X, int _Y);
    //Point( const Point&amp; pt);
    ~Point();
    //Point&amp; operator=(const Point&amp; pt);
    //bool operator==(const Point&amp; pt) const;
};
Point::Point() : x(0), y(0) {}
//Point::Point(int X, int Y) : x(X), y(Y) {}
Point::Point(T X, T Y) : x(X), y(Y) {}
//Point::Point( const Point&amp; pt) : x(pt.x), y(pt.y) {}

Point::~Point() {}

int main() {
  cout &lt;&lt; &quot;!!!Hello World!!!&quot; &lt;&lt; endl; // prints !!!Hello World!!!
  Point&lt;int&gt; p; // = new Point(1,2);
  //Point* p  = new Point(1,2);
  return 0;
}
</code></pre>
<p>@Edit:<br />
Ach ja, die Fehlermeldung^^:</p>
<pre><code>test.cpp:20: error: ‘template&lt;class T&gt; class Point’ used without template parameters
test.cpp:20: error: ISO C++ forbids declaration of ‘Point’ with no type
test.cpp: In function ‘int Point()’:
test.cpp:20: error: ‘int Point()’ redeclared as different kind of symbol
test.cpp:6: error: previous declaration of ‘template&lt;class T&gt; class Point’
test.cpp:20: error: only constructors take base initializers
test.cpp: At global scope:
test.cpp:22: error: ‘template&lt;class T&gt; class Point’ used without template parameters
test.cpp:22: error: expected constructor, destructor, or type conversion before ‘(’ token
test.cpp:25: error: expected constructor, destructor, or type conversion before ‘::’ token
</code></pre>
<p>Ich verwende g++ 4.4.3.</p>
<p>Vielen Dank schonmal im Voraus für eure Hilfe <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="😉"
    /> ,<br />
Lukas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327605</guid><dc:creator><![CDATA[lukas.braband]]></dc:creator><pubDate>Fri, 31 May 2013 13:55:04 GMT</pubDate></item><item><title><![CDATA[Reply to Einfaches Klassentemplate kompiliert nicht on Fri, 31 May 2013 14:00:33 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;class T&gt;
class Point {
public:
    T x, y;
    Point();
    Point(T X, T Y);
    ~Point();
};

template&lt;typename T&gt; Point&lt;T&gt;::Point() : x(0), y(0) {}
template&lt;typename T&gt; Point&lt;T&gt;::Point(T X, T Y) : x(X), y(Y) {}
template&lt;typename T&gt; Point&lt;T&gt;::~Point() {}

int main() {
  Point&lt;int&gt; p;
  return 0;
}
</code></pre>
<p>Allerdings gibt es in Templates keinen wirklichen Grund, die Definition der Methoden von der Deklaration der Template zu trennen. Ich würde einfach</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class Point {
public:
    T x, y;
    Point()         : x(0), y(0) {}
    Point(T X, T Y) : x(X), y(Y) {}

    ~Point() { }
};

int main() {
  Point&lt;int&gt; p;
  return 0;
}
</code></pre>
<p>schreiben.</p>
<p>Btw: Die Bezeichner _X und _Y sind für die Implementation (Compiler und Standardbibliothek) reserviert, du darfst sie also nicht verwenden. Allgemeine Regel: Reserviert sind</p>
<p>1. Bezeichner, die mit einem Unterstrich gefolgt von einem Großbuchstaben beginnen (_X, _Foo)<br />
2. Bezeichner, die zwei Unterstriche in Folge beinhalten (__foo, foo__bar)<br />
3. im globalen Scope alle weiteren Bezeichner, die mit einem Unterstrich beginnen (_foo, _bar).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327610</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 31 May 2013 14:00:33 GMT</pubDate></item><item><title><![CDATA[Reply to Einfaches Klassentemplate kompiliert nicht on Fri, 31 May 2013 14:08:27 GMT]]></title><description><![CDATA[<p>Der Compiler muss noch wissen, worauf sich die Funktionsdeklarationen überhaupt beziehen, das heißt, du musst jeweils</p>
<pre><code>template&lt;typename T&gt; Point&lt;T&gt;::Point() : x(0), y(0) {}
</code></pre>
<p>und so weiter schreiben.</p>
<p><strong>Aber:</strong><br />
Das sieht mir aus, als wolltest du die Auftrennung in Header und Quellcodedatei vorbereiten. Das funktioniert nicht. Für Templates muss die Definition stets dort vorliegen, wo sie benutzt wird (es gibt noch ein paar andere Möglichektien, die hier nicht wichtig sind). Das heißt, das muss sowieso alles in den Header. Ich würde es daher gleich in die Klassendefinition schreiben:</p>
<pre><code>template&lt;class T&gt;
class Point {
public:
    T x, y;
    Point()  : x(0), y(0) {}
    Point(T _X, T _Y) : x(_X), y(_Y) {}
    ~Point(){};
};
</code></pre>
<p><strong>Aber:</strong><br />
Den unbenutzten Destruktor lassen wir gleich weg und gewöhnen uns in Zukunft an, diese besonderen Funktionen nur zu definieren, wenn uns die compilergenerierte Version nicht ausreicht (was sehr selten sein sollte). Ebenso der schon im Kommentar vorbereitete Zuweisungsgenerator:</p>
<pre><code>template&lt;class T&gt;
class Point {
public:
    T x, y;
    Point()  : x(0), y(0) {}
    Point(T _X, T _Y) : x(_X), y(_Y) {}
};
</code></pre>
<p><strong>Aber:</strong><br />
Wir denken nochmal über sinnvolle Defaultwerte nach. Einerseits ist</p>
<pre><code>Point()  : x(0), y(0) {}
    Point(T _X, T _Y) : x(_X), y(_Y) {}
</code></pre>
<p>identisch zu</p>
<pre><code>Point(T _X = 0, T _Y = 0) : x(_X), y(_Y) {}
</code></pre>
<p>oder allgemeiner:</p>
<pre><code>Point(T _X = T(), T _Y = T()) : x(_X), y(_Y) {}
</code></pre>
<p>Aber ist das semantisch richtig? Warum ist ein uninitialisierter Punkt Null? Das macht meiner Meinung nach keinen Sinn. Entweder gibt es gar keine uninitialisierten Punkte oder sie sind auch wirklich uninitialisiert. Also</p>
<pre><code>Point() {}
   Point(T _X, T _Y) : x(_X), y(_Y) {}
</code></pre>
<p>oder</p>
<pre><code>Point(T _X, T _Y) : x(_X), y(_Y) {}
</code></pre>
<p>(ich würde Ersteres bevorzugen, kenne aber dein genaues Problem nicht)</p>
<p>Noch etwas ganz anderes: Guck dir mal an, was <code>endl</code> genau macht. Willst du wirklich <code>flush</code> en oder möchtest du bloß einen Zeilenumbruch ( <code>\n</code> )?</p>
<p>edit: Und die Bemerkung über mir hinsichtlich der Bezeichner _X und _Y ist natürlich auch richtig und wichtig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327614</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 31 May 2013 14:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to Einfaches Klassentemplate kompiliert nicht on Fri, 31 May 2013 14:15:38 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Den unbenutzten Destruktor lassen wir gleich weg und gewöhnen uns in Zukunft an, diese besonderen Funktionen nur zu definieren, wenn uns die compilergenerierte Version nicht ausreicht (was sehr selten sein sollte).</p>
</blockquote>
<p>In dieser Allgemeinheit ist das falsch.</p>
<p>Manche Guidelines raten sogar dazu, immer den leeren Destruktor zu definieren.</p>
<p>&lt;a href= schrieb:</p>
<blockquote>
<p><a href="http://www.chromium.org/developers/coding-style#TOC-Inline-functions" rel="nofollow">http://www.chromium.org/developers/coding-style#TOC-Inline-functions</a>&quot;&gt;It can be tempting to inline &quot;empty&quot; constructors and destructors: [...] <strong>Don't do this</strong>. Implicit initialization of members can result in generating nontrivial amount of code, which then gets duplicated for every new/delete site. Even classes that don't have such members now might have them later, so in general, define these out-of-line</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2327618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327618</guid><dc:creator><![CDATA[krom]]></dc:creator><pubDate>Fri, 31 May 2013 14:15:38 GMT</pubDate></item><item><title><![CDATA[Reply to Einfaches Klassentemplate kompiliert nicht on Fri, 31 May 2013 14:23:44 GMT]]></title><description><![CDATA[<p>krom schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Den unbenutzten Destruktor lassen wir gleich weg und gewöhnen uns in Zukunft an, diese besonderen Funktionen nur zu definieren, wenn uns die compilergenerierte Version nicht ausreicht (was sehr selten sein sollte).</p>
</blockquote>
<p>In dieser Allgemeinheit ist das falsch.</p>
<p>Manche Guidelines raten sogar dazu, immer den leeren Destruktor zu definieren.</p>
<p>&lt;a href= schrieb:</p>
<blockquote>
<p><a href="http://www.chromium.org/developers/coding-style#TOC-Inline-functions" rel="nofollow">http://www.chromium.org/developers/coding-style#TOC-Inline-functions</a>&quot;&gt;It can be tempting to inline &quot;empty&quot; constructors and destructors: [...] <strong>Don't do this</strong>. Implicit initialization of members can result in generating nontrivial amount of code, which then gets duplicated for every new/delete site. Even classes that don't have such members now might have them later, so in general, define these out-of-line</p>
</blockquote>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Ich glaube, du hast nicht verstanden, worum es geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327620</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 31 May 2013 14:23:44 GMT</pubDate></item><item><title><![CDATA[Reply to Einfaches Klassentemplate kompiliert nicht on Fri, 31 May 2013 14:37:48 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>krom schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Den unbenutzten Destruktor lassen wir gleich weg und gewöhnen uns in Zukunft an, diese besonderen Funktionen nur zu definieren, wenn uns die compilergenerierte Version nicht ausreicht (was sehr selten sein sollte).</p>
</blockquote>
<p>In dieser Allgemeinheit ist das falsch.</p>
<p>Manche Guidelines raten sogar dazu, immer den leeren Destruktor zu definieren.</p>
<p>&lt;a href= schrieb:</p>
<blockquote>
<p><a href="http://www.chromium.org/developers/coding-style#TOC-Inline-functions" rel="nofollow">http://www.chromium.org/developers/coding-style#TOC-Inline-functions</a>&quot;&gt;It can be tempting to inline &quot;empty&quot; constructors and destructors: [...] <strong>Don't do this</strong>. Implicit initialization of members can result in generating nontrivial amount of code, which then gets duplicated for every new/delete site. Even classes that don't have such members now might have them later, so in general, define these out-of-line</p>
</blockquote>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Ich glaube, du hast nicht verstanden, worum es geht.</p>
</blockquote>
<p>Doch?<br />
Du: Es macht nie Sinn, <code>Class::Class(){}</code> zu schreiben, weder im Header noch im cpp, weil das Verhalten das gleiche ist.<br />
Chromium: Es macht immer Sinn, <code>Class::Class(){}</code> zu schreiben, weil dann die Kompilierzeit verringert wird und das Binary kleiner ist.</p>
<p>In dem Kontext hier, wo es um Templates geht, macht das natürlich keinen Unterschied, aber allgemein akzeptiert ist deine Aussage nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327624</guid><dc:creator><![CDATA[krom]]></dc:creator><pubDate>Fri, 31 May 2013 14:37:48 GMT</pubDate></item><item><title><![CDATA[Reply to Einfaches Klassentemplate kompiliert nicht on Fri, 31 May 2013 14:42:22 GMT]]></title><description><![CDATA[<p>Okay, vielen vielen Dank für die schnelle, kompetente Hilfe ;-).</p>
<p>Woher soll man denn auch ahnen, dass diese Klassentemplate-Funktionen jetzt auf einmal nicht mehr außerhalb der Klasse definiert werden dürfen <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="🙄"
    /> ?<br />
Es wird einem doch immer gesagt, zwecks Übersichtlichkeit alles aufzuteilen, woran man sich ja auch schnell gewöhnt...<br />
Aber gut, wenns mans weiß, weiß mans :-/.</p>
<p>In dem Beispiel von meinem Prof sind die Funktionen allerdings auch nicht INNERHALB der Klasse definiert, sondern mit</p>
<pre><code>template&lt;classe T&gt;
inline Point&lt;T&gt;::Point(T _x, T _y) : x(_x), y(_y) {}
</code></pre>
<p>Vlt. repariert sein Visual Studio das ja irgendwie noch nachträglich..?</p>
<p>Nagut, mir egal - bei mir gehts jetzt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327625</guid><dc:creator><![CDATA[lukas.braband]]></dc:creator><pubDate>Fri, 31 May 2013 14:42:22 GMT</pubDate></item><item><title><![CDATA[Reply to Einfaches Klassentemplate kompiliert nicht on Fri, 31 May 2013 14:51:17 GMT]]></title><description><![CDATA[<p>lukas.braband schrieb:</p>
<blockquote>
<p>Okay, vielen vielen Dank für die schnelle, kompetente Hilfe ;-).</p>
<p>Woher soll man denn auch ahnen, dass diese Klassentemplate-Funktionen jetzt auf einmal nicht mehr außerhalb der Klasse definiert werden dürfen <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>
</blockquote>
<p>Das wurde so nicht gesagt (wäre auch falsch). Allerdings muss (im Allgemeinen...) die Definition eines Templates in jeder Übersetzungseinheit vorliegen, in der es benutzt wird. Das schließt i.d.R. die Definition von Templates in einer .cpp-Datei o.ä. aus.<br />
Die Definition der Memberfunktionen deshalb nicht gleich inline innerhalb der Definition des Klassentemplates erfolgen - das ist aber häuflich bequem und erzeugt weniger syntaktischen Lärm.</p>
<p>lukas.braband schrieb:</p>
<blockquote>
<p>In dem Beispiel von meinem Prof sind die Funktionen allerdings auch nicht INNERHALB der Klasse definiert, sondern mit</p>
<pre><code>template&lt;classe T&gt;
inline Point&lt;T&gt;::Point(T _x, T _y) : x(_x), y(_y) {}
</code></pre>
</blockquote>
<p>Das ist auch in Ordnung so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327632</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 31 May 2013 14:51:17 GMT</pubDate></item><item><title><![CDATA[Reply to Einfaches Klassentemplate kompiliert nicht on Fri, 31 May 2013 15:07:15 GMT]]></title><description><![CDATA[<p>und warum funktioniert eine Überladung des &lt;&lt;-Operators bei mir nicht:</p>
<pre><code>template&lt;class T&gt;
inline ostream&amp; operator&lt;&lt;(ostream&amp; s, const Point&lt;T&gt;&amp; pt);
</code></pre>
<pre><code>template&lt;class T&gt;
inline ostream&amp; operator&lt;&lt;(ostream&amp; s, const Point&lt;T&gt;&amp; pt) {
	s &lt;&lt; &quot;(&quot; &lt;&lt; setw(5) &lt;&lt; setprecision(3) &lt;&lt; pt.x &lt;&lt; &quot; &quot;
	  &lt;&lt; setw(5) &lt;&lt; setprecision(3) &lt;&lt; pt.y &lt;&lt; &quot;)&quot;;
	return s;
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Ist jetzt beides in der Pt.h drin..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327635</guid><dc:creator><![CDATA[lukas.braband]]></dc:creator><pubDate>Fri, 31 May 2013 15:07:15 GMT</pubDate></item><item><title><![CDATA[Reply to Einfaches Klassentemplate kompiliert nicht on Fri, 31 May 2013 16:04:18 GMT]]></title><description><![CDATA[<p>funktioniert nicht<br />
ist keine Fehlerbeschreibung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327647</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 31 May 2013 16:04:18 GMT</pubDate></item><item><title><![CDATA[Reply to Einfaches Klassentemplate kompiliert nicht on Fri, 31 May 2013 16:27:32 GMT]]></title><description><![CDATA[<p>Die Überladung des stream Ausgabe-Operators (sowie des Eingabe-Operators) muß eine freie Funktion sein, d.h. lösche die Deklaration innerhalb der Point&lt;T&gt;-Klasse (d.h. lasse nur den Code außerhalb stehen).</p>
<p>Alternativ kannst/darfst du auch diesen Operator als 'friend' deklarieren (sofern du auf Interna zugreifen willst):</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class Point
{
  // ...

  template&lt;class T&gt;
  friend ostream&amp; operator&lt;&lt;(ostream&amp; s, const Point&lt;T&gt;&amp; pt);
};

template&lt;class T&gt;
inline ostream&amp; operator&lt;&lt;(ostream&amp; s, const Point&lt;T&gt;&amp; pt)
{
    return s &lt;&lt; &quot;(&quot; &lt;&lt; setw(5) &lt;&lt; setprecision(3) &lt;&lt; pt.x &lt;&lt; &quot; &quot;
             &lt;&lt; setw(5) &lt;&lt; setprecision(3) &lt;&lt; pt.y &lt;&lt; &quot;)&quot;;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2327650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327650</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Fri, 31 May 2013 16:27:32 GMT</pubDate></item><item><title><![CDATA[Reply to Einfaches Klassentemplate kompiliert nicht on Sat, 01 Jun 2013 00:48:02 GMT]]></title><description><![CDATA[<p>ah, sorry:</p>
<pre><code>../src/Point.h:30: error: expected initializer before ‘&amp;’ token
../src/Point.h:47: error: expected initializer before ‘&amp;’ token
</code></pre>
<p>Und die Funktionen waren eig. schon nicht innerhalb der Klassen-deklaration (nur in der Datei Point.h).<br />
Und auch als friend-Funktion bleibt der selbe Fehler bestehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /> ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327722</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327722</guid><dc:creator><![CDATA[lukas.braband]]></dc:creator><pubDate>Sat, 01 Jun 2013 00:48:02 GMT</pubDate></item><item><title><![CDATA[Reply to Einfaches Klassentemplate kompiliert nicht on Sat, 01 Jun 2013 06:34:23 GMT]]></title><description><![CDATA[<p>#include &lt;ostream&gt; bzw. iosfwd vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327737</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 01 Jun 2013 06:34:23 GMT</pubDate></item><item><title><![CDATA[Reply to Einfaches Klassentemplate kompiliert nicht on Sat, 01 Jun 2013 07:46:09 GMT]]></title><description><![CDATA[<p>Ups, sehe gerade, es muß natürlich überall &quot;std::ostream&quot; heißen (das passiert wenn man einfach Code per C&amp;P hier im Forum übernimmt ;-).</p>
<p>Und für die Manipulatoren zusätzlich noch &lt;iomanip&gt; einbinden (und auch dort dann &quot;std::&quot; davorsetzen).</p>
<p>Denn niemals &quot;using namespace std;&quot; auf globaler Ebene im Header einsetzen!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327742</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sat, 01 Jun 2013 07:46:09 GMT</pubDate></item></channel></rss>