<?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[Anfängerfrage Template]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich soll eine Liste schreiben, welche sowohl ein T als auch ein T &amp; (Referenz) speichern kann. Die Liste soll folgende Funktionen bereitstellen:<br />
void add(T elem), T&amp; get(int index), bool contains(T&amp; elem), void remove(int index); size_t size();</p>
<p>das ganze wollte ich über eine std::vector abbilden, leider scheitere ich schon da:</p>
<pre><code>template &lt;typename T&gt; class List {
 public:

   void add(T elem);
   T&amp; get(int index);
   bool contains(T&amp; elem);
   void remove(int index); 
   size_t size();

 private:
  typedef std::vector&lt;T&gt; AList;
  AList list;
}
</code></pre>
<p>Der Compiler will weder die get Methode, noch meine Definition von der list. Von der Implementierung will ich gar nicht erst reden. Kann mir jemand einen Tip geben? Danke <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269650/anfängerfrage-template</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 19:56:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269650.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Jun 2010 22:24:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Anfängerfrage Template on Mon, 28 Jun 2010 22:24:02 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich soll eine Liste schreiben, welche sowohl ein T als auch ein T &amp; (Referenz) speichern kann. Die Liste soll folgende Funktionen bereitstellen:<br />
void add(T elem), T&amp; get(int index), bool contains(T&amp; elem), void remove(int index); size_t size();</p>
<p>das ganze wollte ich über eine std::vector abbilden, leider scheitere ich schon da:</p>
<pre><code>template &lt;typename T&gt; class List {
 public:

   void add(T elem);
   T&amp; get(int index);
   bool contains(T&amp; elem);
   void remove(int index); 
   size_t size();

 private:
  typedef std::vector&lt;T&gt; AList;
  AList list;
}
</code></pre>
<p>Der Compiler will weder die get Methode, noch meine Definition von der list. Von der Implementierung will ich gar nicht erst reden. Kann mir jemand einen Tip geben? Danke <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918669</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Mon, 28 Jun 2010 22:24:02 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage Template on Mon, 28 Jun 2010 22:26:49 GMT]]></title><description><![CDATA[<p>Was ist dein Problem?</p>
<ol>
<li>Semikolon hinter '}'</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1918670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918670</guid><dc:creator><![CDATA[Zeus]]></dc:creator><pubDate>Mon, 28 Jun 2010 22:26:49 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage Template on Mon, 28 Jun 2010 23:16:25 GMT]]></title><description><![CDATA[<p>Warum willst Du das überhaupt machen? Nur die Namen ändern? Alles was Du da an Funktionen aufführst ist doch in std::list schon vorhanden. Wozu die Kapselung? Und mit ; am Ende kompilierts auch.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918675</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Mon, 28 Jun 2010 23:16:25 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage Template on Tue, 29 Jun 2010 06:11:38 GMT]]></title><description><![CDATA[<p>uwerothfeld schrieb:</p>
<blockquote>
<p>ich soll eine Liste schreiben, welche sowohl ein T als auch ein T &amp; (Referenz) speichern kann.</p>
</blockquote>
<p>als generelle Anmerkung:<br />
Du kannst std::vector nicht mit einer Referenz verwenden...<br />
Bei std::list bin ich nicht sicher, aber ich glaube auch nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918695</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 29 Jun 2010 06:11:38 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage Template on Tue, 29 Jun 2010 07:25:51 GMT]]></title><description><![CDATA[<p>Kein Std-Container kann Referenzen von Haus aus speichern. Wozu auch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918717</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 29 Jun 2010 07:25:51 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage Template on Tue, 29 Jun 2010 08:34:01 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>also Referenzen speichern geht nicht. Ok.</p>
<p>Als Fehler bekomme ich genau:</p>
<pre><code>g++    -c -g -Werror -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.cc
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h: In instantiation of ‘__gnu_cxx::new_allocator&lt;A::B::Peer&amp;&gt;’:
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/allocator.h:83:   instantiated from ‘std::allocator&lt;A::B::Peer&amp;&gt;’
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:78:   instantiated from ‘std::_Vector_base&lt;A::B::Peer&amp;, std::allocator&lt;A::B::Peer&amp;&gt; &gt;’
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:159:   instantiated from ‘std::vector&lt;A::B::Peer&amp;, std::allocator&lt;A::B::Peer&amp;&gt; &gt;’
common/../PeerList.h:48:   instantiated from ‘A::B::PeerList&lt;A::B::Peer&amp;&gt;’
main.cc:34:   instantiated from here
</code></pre>
<p>Was immer das auch heißen soll. Die Ziele 48 ist:</p>
<pre><code class="language-cpp">typedef std::vector&lt;T&gt; AList;
AList list;
</code></pre>
<p>Warum ich dies mache? Also das eigentliche Ziel ist die Verwaltung einer Gruppe, welche in Teilgruppen zerlegt ist. Jede Teilgruppe hat nun so eine Liste, wo es die einzelnen Element speichert. Ich verwende nicht direkt std::vector, da dies so einfacher zu benutzen ist, für mich. Außerdem sollen noch ein paar Funktionen dazu, die so std::vector nicht bietet. Referenzen wollte ich speichern, damit, wenn man sich ein Element aus einer Teilgruppe holt (via: Gruppe.getTeilgruppe(2).getElement(2) ) und dieses ändert, diese Änderungen auch in der Gruppe bestehen (also keine Änderungen an lokalen Kopien gemacht werden).</p>
<p>Oder gibt es da ein besseres Konzept?</p>
<p>Gruß, Uwe</p>
<p>PS: Warum können stl container eigentlich keinen Referenzen speichern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918739</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Tue, 29 Jun 2010 08:34:01 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage Template on Tue, 29 Jun 2010 08:44:33 GMT]]></title><description><![CDATA[<p>uwerothfeld schrieb:</p>
<blockquote>
<p>Oder gibt es da ein besseres Konzept?</p>
</blockquote>
<p>Nein, das ist eigentlich schon okay. Du kannst allerdings immer noch Referenzen zurückliefern, auch wenn intern Zeiger gespeichert werden.</p>
<p>Hast du <code>&lt;vector&gt;</code> eingebunden? Zeig nochmals den kompletten Code der Klassendefinition.</p>
<p>uwerothfeld schrieb:</p>
<blockquote>
<p>PS: Warum können stl container eigentlich keinen Referenzen speichern?</p>
</blockquote>
<p>Weil Referenzen keine Objekte sind und damit etliche Einschränkungen mit sich bringen (z.B. keine Wertsemantik und nicht adressierbar).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918756</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 29 Jun 2010 08:44:33 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage Template on Tue, 29 Jun 2010 08:54:02 GMT]]></title><description><![CDATA[<p>Hallo Nexus,</p>
<p>hier mal der ganze Code.</p>
<pre><code class="language-cpp">#ifndef _PEERLIST_H
#define	_PEERLIST_H

#include &quot;Peer.h&quot;
#include &lt;vector&gt;
#include &quot;stddef.h&quot;

namespace A {
    namespace B {    
        template &lt;typename T&gt; class PeerList {
        public:
            PeerList();
            virtual ~PeerList();
            size_t size() const;          
            bool contains(T a) const;
            bool contains(PeerID id) const;
            T get(size_t index) const;
            T get(PeerID id) const;
            void toIntArray(int* destList);
            T operator [](unsigned int n);
            void add(T a);
            void clear();
            void remove(T a);
            void remove(PeerID pId);
        private:
            typedef std::vector&lt;T&gt; PList;
            PList queue;
        };

    };
};
#endif	/* _PEERLIST_H */
</code></pre>
<p>Vielen Dank!<br />
Uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918763</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Tue, 29 Jun 2010 08:54:02 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage Template on Tue, 29 Jun 2010 08:57:14 GMT]]></title><description><![CDATA[<p>uwerothfeld schrieb:</p>
<blockquote>
<p>hier mal der ganze Code.</p>
</blockquote>
<p>Das ist nicht der ganze Code, zumal Templates immer im Header definiert werden müssen (Eine Aufteilung in Header/Source funktioniert nicht - oder nur mit Klimmzügen, wie Include der Source am Dateiende... [Dann aber bitte keine using namespaces usw.]).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918764</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 29 Jun 2010 08:57:14 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage Template on Tue, 29 Jun 2010 09:12:16 GMT]]></title><description><![CDATA[<p>Ich hatte zwar nur nach der Klassendefinition gefragt, aber es ist dennoch merkwürdig, dass du nicht am Ende noch eine andere Headerdatei mit den Methodendefinitionen inkludierst. Das wäre nämlich eine übliche Technik bei Templates, um trotzdem Schnittstelle und Implementierung zu trennen.</p>
<p>Davon abgesehen ein paar andere Fragen und Vorschläge:</p>
<pre><code class="language-cpp">#ifndef _PEERLIST_H
</code></pre>
<p>Du solltest in C++ keine Bezeichner mit Unterstrich und Grossbuchstaben am Anfang oder mit zwei aufeinanderfolgenden Grossbuchstaben wählen. Nimm doch <code>PEERLIST_H</code> oder eindeutiger <code>MEINPROJEKT_PEERLIST_H</code> .</p>
<pre><code class="language-cpp">#include &quot;stddef.h&quot;
</code></pre>
<p>In C++ heisst der Header <code>&lt;cstddef&gt;</code> .</p>
<pre><code class="language-cpp">virtual ~PeerList();
</code></pre>
<p>Ist die Klasse für Polymorphie vorgesehen? Dann ist der Destruktor leer, oder?</p>
<pre><code class="language-cpp">bool contains(T a) const;
void remove(T a);
</code></pre>
<p>Hier hast du unnötige Kopien, verwende stattdessen Const-Referenzen ( <code>const T&amp;</code> ).</p>
<pre><code class="language-cpp">T get(size_t index) const;
T operator [](unsigned int n);
</code></pre>
<p>Warum zwei Methoden für das gleiche, aber mit komplett anderer Schnittstelle ( <code>size_t</code> vs. <code>unsigned int</code> , <code>const</code> vs. veränderlich, andere Parameternamen)? Ich würde die Schnittstelle nicht grösser als nötig machen. Ausserdem kann es ratsam sein, eine <code>const</code> -Überladung anzubieten, die das Objekt nicht verändert, und nebenbei eine mit Referenzrückgabe ( <code>T&amp;</code> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1918766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1918766</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 29 Jun 2010 09:12:16 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerfrage Template on Mon, 05 Jul 2010 11:13:26 GMT]]></title><description><![CDATA[<p>hallo zusammen,</p>
<p>vielen Dank für die Tips. Einiges konnte ich beheben, aber das Thema Template ist schon etwas komplexer, als gedacht.</p>
<p>gruß, uwe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921537</guid><dc:creator><![CDATA[uwerothfeld]]></dc:creator><pubDate>Mon, 05 Jul 2010 11:13:26 GMT</pubDate></item></channel></rss>