<?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[(friend)Template-Klassen und Vorwärtsdeklaration, ...]]></title><description><![CDATA[<p>Hallo erstmal. Ein chönes Forum habt ihr hier. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Ich bereite mich momentan auf eine C++-Klausur vor und arbeite alte Klausur-Aufgaben durch. Dabei bin ich über folgende Aufgabe gestoßen:</p>
<p>Gegeben: Definitionen zweier Klassen Stack und Stack_el (Elemente des Stacks) mit einigen Feinheiten die ich hier nicht alle aufzählen möchte (Siehe Codebeispiel).</p>
<p>Aufgabe: Klassen in Template-Klassen umwandeln.</p>
<p>So weit bin ich gediehen:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
using namespace std;
template &lt;typename T&gt; class Stack;
template &lt;typename T&gt; class Stack_el{
   private:
       T eintrag;
       Stack_el* next;
   public:
       Stack_el() { next=NULL; }
       template &lt;typename T&gt; friend class Stack; // Problem 1
};
template &lt;typename T&gt; class Stack{
   private: 
       Stack_el* data; // Problem 2
   public: 
       Stack(){ data=NULL; }
       void push(T);
       T pop();
};
int main(){

 return 0;
}
</code></pre>
<p>Die Funktionen push und pop habe ich noch nicht geschrieben, weil erst einmal obiger Pointer (Problem 2) korrekt laufen müsste.</p>
<p>Soweit wie es hier steht (wenn ich die zwei Problemzeilen auskommentiere) kompiliert das Programm wenigstens schon mal einwandfrei.</p>
<p>Wie kann ich den Pointer und die friend-Deklaration hier ans laufen kriegen?<br />
Wenn ich für die beiden Klassen einmal Typename T und einmal Typename S verwende läuft der Rahmen und die friend-Deklaration funktioniert, aber der Pointer immer noch nicht - und ist das überhaupt im Sinne des Erfinders (Aufgabenstellers)?</p>
<p>Schöne Grüße,</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/260066/friend-template-klassen-und-vorwärtsdeklaration</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 09:34:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/260066.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 31 Jan 2010 14:28:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to (friend)Template-Klassen und Vorwärtsdeklaration, ... on Sun, 31 Jan 2010 14:28:32 GMT]]></title><description><![CDATA[<p>Hallo erstmal. Ein chönes Forum habt ihr hier. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Ich bereite mich momentan auf eine C++-Klausur vor und arbeite alte Klausur-Aufgaben durch. Dabei bin ich über folgende Aufgabe gestoßen:</p>
<p>Gegeben: Definitionen zweier Klassen Stack und Stack_el (Elemente des Stacks) mit einigen Feinheiten die ich hier nicht alle aufzählen möchte (Siehe Codebeispiel).</p>
<p>Aufgabe: Klassen in Template-Klassen umwandeln.</p>
<p>So weit bin ich gediehen:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
using namespace std;
template &lt;typename T&gt; class Stack;
template &lt;typename T&gt; class Stack_el{
   private:
       T eintrag;
       Stack_el* next;
   public:
       Stack_el() { next=NULL; }
       template &lt;typename T&gt; friend class Stack; // Problem 1
};
template &lt;typename T&gt; class Stack{
   private: 
       Stack_el* data; // Problem 2
   public: 
       Stack(){ data=NULL; }
       void push(T);
       T pop();
};
int main(){

 return 0;
}
</code></pre>
<p>Die Funktionen push und pop habe ich noch nicht geschrieben, weil erst einmal obiger Pointer (Problem 2) korrekt laufen müsste.</p>
<p>Soweit wie es hier steht (wenn ich die zwei Problemzeilen auskommentiere) kompiliert das Programm wenigstens schon mal einwandfrei.</p>
<p>Wie kann ich den Pointer und die friend-Deklaration hier ans laufen kriegen?<br />
Wenn ich für die beiden Klassen einmal Typename T und einmal Typename S verwende läuft der Rahmen und die friend-Deklaration funktioniert, aber der Pointer immer noch nicht - und ist das überhaupt im Sinne des Erfinders (Aufgabenstellers)?</p>
<p>Schöne Grüße,</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848071</guid><dc:creator><![CDATA[BlackSimon]]></dc:creator><pubDate>Sun, 31 Jan 2010 14:28:32 GMT</pubDate></item><item><title><![CDATA[Reply to (friend)Template-Klassen und Vorwärtsdeklaration, ... on Sun, 31 Jan 2010 14:39:06 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;T&gt; friend class Stack;
</code></pre>
<p>Ansonsten ist es üblich, StackElem als private innere Klasse:</p>
<pre><code class="language-cpp">class Stack
{
    class StackElem {
    };
};
</code></pre>
<p>Da StackElem nicht von außen verwendet wird, sondern nur intern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848075</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sun, 31 Jan 2010 14:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to (friend)Template-Klassen und Vorwärtsdeklaration, ... on Sun, 31 Jan 2010 15:25:04 GMT]]></title><description><![CDATA[<p>Ja, das mag zwar üblich sein - aber in der Aufgabenstellung ist es leider so gefordert.</p>
<p>Den Pointer habe ich auch in den Griff bekommen:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
using namespace std;
template &lt;typename T&gt; class Stack;
template &lt;typename T&gt; class Stack_el{
   private:
       T eintrag;
       Stack_el* next;
   public:
       Stack_el() { next=NULL; }
       Stack_el(T n){ eintrag = n; next=NULL; }
       template &lt;T&gt; friend class Stack;
};
template &lt;typename T&gt; class Stack{
   private: 
       Stack_el&lt;T*&gt; data;
   public: 
       Stack(){ data=NULL; }
       void push(T);
       T pop();
};

int main(){

 return 0;
}
</code></pre>
<p>Nun zum nächsten Problem. Die Funktion push soll ich außerhalb des Klassenrumpfes definieren.</p>
<p>Normalerweise einfach, z.B. für int: void Stack::push(int neu){ ... }</p>
<p>Nun ist es aber ne Template-Klasse. Ich habe mir das hier zusammengebastelt:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; void Stack&lt;T&gt;::push(T obj){
  Stack_el&lt;T&gt; neu(obj); // Neues Element anlegen
  neu.next = data; // Zeiger auf (zuletzt oben gewesenes) Element setzen
  data = neu; // Neues Element liegt jetzt oben.
}
</code></pre>
<p>Unglaublich komplizierte Ansprache. Welchen Zweck erfüllt hierbei das &lt;T&gt; hinter Stack? Ohne kompiliert es nicht, aber ich wüsste gerne, warum ich das da hinschreiben muss.<br />
Genau wie bei dem Pointer oben: Warum muss es Stack_el&lt;T*&gt; next heißen - und nicht Stack_el* next ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848108</guid><dc:creator><![CDATA[BlackSimon]]></dc:creator><pubDate>Sun, 31 Jan 2010 15:25:04 GMT</pubDate></item><item><title><![CDATA[Reply to (friend)Template-Klassen und Vorwärtsdeklaration, ... on Sun, 31 Jan 2010 15:59:16 GMT]]></title><description><![CDATA[<p>Problem1: Du kannst nicht nocheinmal &quot;typename T&quot; schreiben, weil Du T schon verwendet hast. Einen Namen braucht man hier auch gar nicht.</p>
<pre><code>template &lt;typename&gt; friend class Stack;
</code></pre>
<p>müsste funktionieren.</p>
<p>Problem2: Stack_el bezeichnet keine Klasse sondern ein Klassentemplate. Die Klasse, die Du haben willst, ist Stack_el&lt;T&gt;. Damit ergibt sich</p>
<pre><code>Stack_el&lt;T&gt;* next;
</code></pre>
<p>Nur innerhalb des Klassemtemplates Stack_el kannst Du Stack_el als Abkürzung von Stack_el&lt;T&gt; verwenden. Das ist eine Sonderregel.</p>
<p>BlackSimon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Stack_el&lt;T*&gt; data;
</code></pre>
</blockquote>
<p>Du meinst wohl Stack_el&lt;T&gt;*</p>
<blockquote>
<pre><code class="language-cpp">template &lt;typename T&gt; void Stack&lt;T&gt;::push(T obj){
  Stack_el&lt;T&gt; neu(obj); // Neues Element anlegen
  neu.next = data; // Zeiger auf (zuletzt oben gewesenes) Element setzen
  data = neu; // Neues Element liegt jetzt oben.
}
</code></pre>
</blockquote>
<p>Such mal hier im Forum nach einem Zeiger-Tutorial. Hier sind ein paar Fehler drin. Das müsste</p>
<pre><code class="language-cpp">Stack_el&lt;T&gt;* neu = new Stack_el&lt;T&gt;(obj);
neu-&gt;next = data;
data = neu;
</code></pre>
<p>heißen. Kann es sein, dass Du einen Java-Background hast? Es sieht so aus, als ob Dir nicht 100% klar wäre, dass in C++ Objekte &quot;direkt&quot; gehalten werden und eine Variable eines Klassentyps sich <em>nicht</em> wie eine Java-Referenz verhält.</p>
<p>BlackSimon schrieb:</p>
<blockquote>
<p>Unglaublich komplizierte Ansprache. Welchen Zweck erfüllt hierbei das &lt;T&gt; hinter Stack?</p>
</blockquote>
<p>Stack ist ein Template<br />
Stack&lt;foo&gt; ist eine Klasse, die sich aus dem Template ergibt, wenn für T foo eingesetzt wird.</p>
<p>BlackSimon schrieb:</p>
<blockquote>
<p>Ohne kompiliert es nicht, aber ich wüsste gerne, warum ich das da hinschreiben muss.</p>
</blockquote>
<p>Weil's ohne in dem Kontext keinen Typen bezeichnet (wie erforderlich) sondern ein Template.</p>
<p>BlackSimon schrieb:</p>
<blockquote>
<p>Genau wie bei dem Pointer oben: Warum muss es Stack_el&lt;T*&gt; next heißen - und nicht Stack_el* next ?</p>
</blockquote>
<p>Es muss Stack_el&lt;T&gt;* heißen, weil der Compiler nicht automatisch weiß, welche Klasse aus der Klassenfamilie Du meinst. Du könntest ja auch Stack_el&lt;int&gt; benutzen wollen. Lass Dich von den Namen der Typ-Parameter (T) nicht durcheinanderbringen. Das eine T (von Stack_el) hat mit dem anderen (von Stack) erstmal nichts zu tun.</p>
<p>Hier mal ein anderes Beispiel:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; struct foo{};

template&lt;typename T&gt; struct bar{};

template&lt;typename X, typename Y&gt;
class foobar {
  foo&lt;X&gt; * zeiger1;
  bar&lt;Y&gt; * zeiger2;
};
</code></pre>
<p>Woher sollte der Compiler, wenn Du &lt;X&gt; und &lt;Y&gt; in foobar weglässt, wissen, was das für Zeigertypen Du haben willst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848112</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Sun, 31 Jan 2010 15:59:16 GMT</pubDate></item><item><title><![CDATA[Reply to (friend)Template-Klassen und Vorwärtsdeklaration, ... on Tue, 02 Feb 2010 14:57:10 GMT]]></title><description><![CDATA[<p>Danke dir, das hat mir im Verständnis schon einmal enorm weitergeholfen.<br />
Tatsächlich war Java meine erste objektorientierte Programmiersprache, da fühl ich mich wesentlich wohler. Erstaunlich, dass du das aus dem Codefragment herauslesen kannst. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Nun habe ich noch ein Problem: Ich wollte den Stack mit einem Hauptprogramm testen, allerdings erhalte ich da wieder blöde Fehlermeldungen:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
using namespace std;
template &lt;typename T&gt; class Stack;
template &lt;typename T&gt; class Stack_el{
   private:
       T eintrag;
	   Stack_el* next;
   public:
   	   Stack_el() { next=NULL; }
	   Stack_el(T n){ eintrag = n; next=NULL; }
	   template &lt;T&gt; friend class Stack;
};
template &lt;typename T&gt; class Stack{
   private: 
       Stack_el&lt;T&gt;* data;
   public: 
       Stack(){ data=NULL; }
	   void push(T);
	   T pop();
};
template &lt;typename T&gt; void Stack&lt;T&gt;::push(T obj){
  Stack_el&lt;T&gt;* neu = new Stack_el&lt;T&gt;(obj);
  neu-&gt;next = data;
  data = neu;
}
int main(){
 Stack&lt;int&gt; s();
 s-&gt;push(23);
 return 0;
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> test.cpp: In function âint main()â:<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> test.cpp:40: error: request for member âpushâ in âsâ, which is of non-class type âStack&lt;int&gt; ()()â</p>
<p>Und zwar egal, wie ich die Funktion anspreche (s.push() s-&gt;push(), ... , s.push((int)), ...) da habe ich jetzt schon so einiges ausprobiert. Auch die Ausprägung Stack&lt;int&gt; kriege ich durch Ausprobieren nicht an eine passende Stelle eingefügt - das muss man wahrscheinlich schon wieder wissen wie es geht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>P.S.: Ein Pointer-/Zeiger-Tutorial habe ich mit der Board-Suche gesucht. Allerdings ist die dermaßen langsam (inklusive Timeouts) dass ich die richtige Kombination an Suchbegriffen noch nicht finden konnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849198</guid><dc:creator><![CDATA[BlackSimon]]></dc:creator><pubDate>Tue, 02 Feb 2010 14:57:10 GMT</pubDate></item><item><title><![CDATA[Reply to (friend)Template-Klassen und Vorwärtsdeklaration, ... on Tue, 02 Feb 2010 15:03:51 GMT]]></title><description><![CDATA[<p>BlackSimon schrieb:</p>
<blockquote>
<p>Nun habe ich noch ein Problem: Ich wollte den Stack mit einem Hauptprogramm testen, allerdings erhalte ich da wieder blöde Fehlermeldungen:</p>
</blockquote>
<p>Wäre gut, wenn du nächstes Mal die zugehörige Zeile angeben könntest (40 stimmt ja offensichtlich nicht mit deinem Code überein). Was möchtest du hiermit erreichen?</p>
<pre><code class="language-cpp">template &lt;T&gt; friend class Stack;
</code></pre>
<p>Wenn du willst, dass die Klasse zu den Klassen befreundet ist, welche durch Einsetzen des gleichen Templateparameters in das <code>Stack</code> -Template entstehen, kannst du das folgendermassen bewerkstelligen. Schliesslich ist <code>T</code> dann schon gegeben.</p>
<pre><code class="language-cpp">friend class Stack&lt;T&gt;;
</code></pre>
<p>BlackSimon schrieb:</p>
<blockquote>
<p>P.S.: Ein Pointer-/Zeiger-Tutorial habe ich mit der Board-Suche gesucht. Allerdings ist die dermaßen langsam (inklusive Timeouts) dass ich die richtige Kombination an Suchbegriffen noch nicht finden konnte.</p>
</blockquote>
<p><a href="http://magazin.c-plusplus.net/artikel/Pointer%20in%20C%28PlusPlus%29" rel="nofollow">Nimm das!</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849203</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 02 Feb 2010 15:03:51 GMT</pubDate></item><item><title><![CDATA[Reply to (friend)Template-Klassen und Vorwärtsdeklaration, ... on Tue, 02 Feb 2010 15:06:06 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int main(){
 Stack&lt;int&gt; s();  // 1
 s-&gt;push(23);     // 2
 return 0;        // 3
}
</code></pre>
<ol>
<li>Du deklarierst da eine Funktion!</li>
<li>s soll ein normales Objekt auf dem &quot;Stack&quot; (also nicht im Freispeicher) werden, da ist operator-&gt; fehl am Platz.</li>
<li>return 0 ist überflüssig, lass es einfach weg!</li>
</ol>
<p>Damit kommen wir zur korrigierten Fassung:</p>
<pre><code class="language-cpp">int main(){
 Stack&lt;int&gt; s;
 s.push(23);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1849205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849205</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 02 Feb 2010 15:06:06 GMT</pubDate></item><item><title><![CDATA[Reply to (friend)Template-Klassen und Vorwärtsdeklaration, ... on Tue, 02 Feb 2010 15:31:42 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>BlackSimon schrieb:</p>
<blockquote>
<p>Nun habe ich noch ein Problem: Ich wollte den Stack mit einem Hauptprogramm testen, allerdings erhalte ich da wieder blöde Fehlermeldungen:</p>
</blockquote>
<p>Wäre gut, wenn du nächstes Mal die zugehörige Zeile angeben könntest (40 stimmt ja offensichtlich nicht mit deinem Code überein). Was möchtest du hiermit erreichen?</p>
</blockquote>
<p>Entschuldige, ich hatte auskommentierte Zeilen aus dem Code hier gelöscht ohne die Zeile der Fehlermeldung anzupassen. War doof...</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>BlackSimon schrieb:</p>
<blockquote>
<p>P.S.: Ein Pointer-/Zeiger-Tutorial habe ich mit der Board-Suche gesucht. Allerdings ist die dermaßen langsam (inklusive Timeouts) dass ich die richtige Kombination an Suchbegriffen noch nicht finden konnte.</p>
</blockquote>
<p><a href="http://magazin.c-plusplus.net/artikel/Pointer%20in%20C%28PlusPlus%29" rel="nofollow">Nimm das!</a></p>
</blockquote>
<p>Herrlich, danke! Da werde ich mich in den nächsten Stunden und Tagen noch einmal intensiv durcharbeiten. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>l'abra d'or schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int main(){
 Stack&lt;int&gt; s();  // 1
 s-&gt;push(23);     // 2
 return 0;        // 3
}
</code></pre>
<ol>
<li>Du deklarierst da eine Funktion!</li>
<li>s soll ein normales Objekt auf dem &quot;Stack&quot; (also nicht im Freispeicher) werden, da ist operator-&gt; fehl am Platz.</li>
<li>return 0 ist überflüssig, lass es einfach weg!</li>
</ol>
<p>Damit kommen wir zur korrigierten Fassung:</p>
<pre><code class="language-cpp">int main(){
 Stack&lt;int&gt; s;
 s.push(23);
}
</code></pre>
</blockquote>
<p>Hmm.<br />
Zu 1) Eigentlich rufe ich da den (Standard-)Konstruktor der Klasse Stack auf, wie er weiter oben definiert wurde. <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 />
Wenn ich das in deinen Korrekturvorschlag anpasse, läuft der Compiler Amok:</p>
<p>test.cpp: In instantiation of âStack_el&lt;int&gt;â:<br />
test.cpp:22: instantiated from âvoid Stack&lt;T&gt;::push(T) [with T = int]â<br />
test.cpp:28: instantiated from here<br />
test.cpp:3: error: template parameter âclass Tâ<br />
test.cpp:7: error: redeclared here as âint &lt;anonymous&gt;â</p>
<p>Zu 2) Siehe Pointer-Tutorial das ich noch vor mir habe. Da hatte ich zuerst s.push(23) stehen. ^^</p>
<p>zu 3) return 0 überflüssig? Das haben mir meine Übungsleiter anders eingedrillt. Ein Weglassen lässt mir er Compiler aber tatsächlich durchgehen, hätte ich nicht gedacht. <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 />
In der Klausur werd ichs trotzdem sicherheitshalber mal notieren, falls ich überhaupt eine Hauptfunktion schreiben muss (sehr unwahrscheinlich).</p>
<p>Danke soweit!</p>
<p>---</p>
<p>Wenn ich jetzt noch Nexus Tipp zur Friend-Deklaration umsetze funktioniert der Code aus deinem Verbesserungsvorschlag einwandfrei!</p>
<p>Aber warum genau Stack&lt;int&gt; s; statt Stack&lt;int&gt; s() oder Stack &lt;int&gt; s = new Stack&lt;int&gt;()? <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="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849220</guid><dc:creator><![CDATA[BlackSimon]]></dc:creator><pubDate>Tue, 02 Feb 2010 15:31:42 GMT</pubDate></item><item><title><![CDATA[Reply to (friend)Template-Klassen und Vorwärtsdeklaration, ... on Tue, 02 Feb 2010 15:41:51 GMT]]></title><description><![CDATA[<p>BlackSimon schrieb:</p>
<blockquote>
<p>Aber warum genau Stack&lt;int&gt; s; statt Stack&lt;int&gt; s() oder Stack &lt;int&gt; s = new Stack&lt;int&gt;()? <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="😕"
    /></p>
</blockquote>
<p>Aus dem gleichen Grund wie hier:</p>
<pre><code class="language-cpp">int i;
int i();
int i* = new int();
</code></pre>
<p>Abgesehen davon, dass der Code ohne * in der 3. Zeile nicht kompiliert, sind das drei verschiedene Dinge. Der Reihenfolge nach:<br />
<strong>1.</strong> Deklaration/Definition einer Variable mit automatischem Speicherbereich (&quot;Stack&quot;)<br />
<strong>2.</strong> Deklaration einer Funktion mit Rückgabetyp <code>int</code> und keinen Parametern<br />
<strong>3.</strong> Deklaration/Definition eines Zeigers, der auf einen dynamisch allokierten <code>int</code> verweist. Freigabe ist manuell über <code>delete</code> erforderlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849229</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 02 Feb 2010 15:41:51 GMT</pubDate></item><item><title><![CDATA[Reply to (friend)Template-Klassen und Vorwärtsdeklaration, ... on Tue, 02 Feb 2010 15:50:29 GMT]]></title><description><![CDATA[<p>Die Lösung bringt dann der letzte Post von Nexus:</p>
<pre><code class="language-cpp">friend class Stack&lt;T&gt;;
</code></pre>
<p>Wenn man sich das genau überlegt ist es auch klar warum.<br />
Da hab ich dir vorher Mist erzählt, hatte selber noch nie das Vergnügen mit friend template classes.</p>
<p>Es wird auch vollkommen unnötig wenn man StackEl als innere Klasse im private-Bereich anlegt. Da macht man alle Member public (oder man nimmt gleich struct), und die Sache ist gegessen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1849235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849235</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 02 Feb 2010 15:50:29 GMT</pubDate></item><item><title><![CDATA[Reply to (friend)Template-Klassen und Vorwärtsdeklaration, ... on Tue, 02 Feb 2010 16:12:59 GMT]]></title><description><![CDATA[<p>Was ist eigentlich ein El? Ist es etwas von <a href="http://de.wikipedia.org/wiki/El" rel="nofollow">hier</a>? :p</p>
<p>Ich meine damit nur, dass man sich für solche Dinge schon vernünftige Bezeichner suchen darf. Zumindest &quot;Elem&quot; ist wohl angebracht, dafür kann man den unnötigen Unterstrich weglassen (also &quot;StackElem&quot;). <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/1849246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1849246</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 02 Feb 2010 16:12:59 GMT</pubDate></item></channel></rss>