<?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[STL-Container wrappen zwecks eigener Iteratoren]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>ich versuche gerade mir eine Wrapper-Klasse für einen STL-Container zu bauen. Einen std::set<a href="std::string" rel="nofollow">std::string</a> im speziellen (templates kommen später). Bisher habe ich's (noch <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="😉"
    /> nicht geschafft. Könnt' ihr mir sagen wo's klemmt?</p>
<p>Mein bisheriger Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;set&gt;

class WrapSet
{
public:
  void insert(const std::string &amp; value)
  {
    values_.insert(value);
  }

  WrapSet::iterator begin()
  {
    return iterator(values_.begin());
  }

  WrapSet::iterator end()
  {
    return iterator(values_.end());
  }

private:
  std::set&lt;std::string&gt; values_;
};

class WrapSet::iterator
{
public:
  iterator() {}

  iterator &amp; operator++()
  {
    it_++;
    return * this;
  }

  WrapSet &amp; operator*() const
  {
    return * it_;
  }

private:
  iterator(const std::set&lt;std::string&gt; &amp; it)
    : it_(it) {}

  std::set&lt;std::string&gt;::iterator it_;
};

int main()
{
  WrapSet ws;

  ws.insert(&quot;bla&quot;);

  for(WrapSet::iterator it = ws.begin(); it != ws.end(); it++)
  {
    std::cout &lt;&lt; *it &lt;&lt; std::endl;
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/255677/stl-container-wrappen-zwecks-eigener-iteratoren</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 21:16:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/255677.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 03 Dec 2009 18:33:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 18:44:15 GMT]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>ich versuche gerade mir eine Wrapper-Klasse für einen STL-Container zu bauen. Einen std::set<a href="std::string" rel="nofollow">std::string</a> im speziellen (templates kommen später). Bisher habe ich's (noch <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="😉"
    /> nicht geschafft. Könnt' ihr mir sagen wo's klemmt?</p>
<p>Mein bisheriger Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;set&gt;

class WrapSet
{
public:
  void insert(const std::string &amp; value)
  {
    values_.insert(value);
  }

  WrapSet::iterator begin()
  {
    return iterator(values_.begin());
  }

  WrapSet::iterator end()
  {
    return iterator(values_.end());
  }

private:
  std::set&lt;std::string&gt; values_;
};

class WrapSet::iterator
{
public:
  iterator() {}

  iterator &amp; operator++()
  {
    it_++;
    return * this;
  }

  WrapSet &amp; operator*() const
  {
    return * it_;
  }

private:
  iterator(const std::set&lt;std::string&gt; &amp; it)
    : it_(it) {}

  std::set&lt;std::string&gt;::iterator it_;
};

int main()
{
  WrapSet ws;

  ws.insert(&quot;bla&quot;);

  for(WrapSet::iterator it = ws.begin(); it != ws.end(); it++)
  {
    std::cout &lt;&lt; *it &lt;&lt; std::endl;
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1817285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817285</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Thu, 03 Dec 2009 18:44:15 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 18:37:15 GMT]]></title><description><![CDATA[<p>goran schrieb:</p>
<blockquote>
<p>Könnt' ihr mir sagen wo's klemmt?</p>
</blockquote>
<p>Nächstes Mal bitte selber -&gt; Fehlermeldung oder sonst eine Problembeschreibung.</p>
<p>Du kannst Klassen nicht mit <code>class WrapSet::iterator</code> neu definieren. Benutze entweder verschachtelte Klassen oder Typedefs innerhalb von <code>WrapSet</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817288</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 03 Dec 2009 18:37:15 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 18:45:49 GMT]]></title><description><![CDATA[<p>Die Fehlermeldung beim kompilieren:</p>
<p>`# g++ WrapSet.h</p>
<p>WrapSet.h:13: error: ‘iterator’ in class ‘WrapSet’ does not name a type</p>
<p>WrapSet.h:18: error: ‘iterator’ in class ‘WrapSet’ does not name a type</p>
<p>WrapSet.h:28: error: qualified name does not name a class before ‘{’ token</p>
<p>WrapSet.h: In function ‘int main()’:</p>
<p>WrapSet.h:57: error: ‘iterator’ is not a member of ‘WrapSet’</p>
<p>WrapSet.h:57: error: expected ‘;’ before ‘it’</p>
<p>WrapSet.h:57: error: ‘it’ was not declared in this scope</p>
<p>WrapSet.h:57: error: ‘class WrapSet’ has no member named ‘end’`</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817295</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Thu, 03 Dec 2009 18:45:49 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 18:48:54 GMT]]></title><description><![CDATA[<p>Danke. Ich habe noch was anderes geschrieben. <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/1817296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817296</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 03 Dec 2009 18:48:54 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 18:54:33 GMT]]></title><description><![CDATA[<p>Der neue Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;set&gt;

class WrapSet
{
public:
  void insert(const std::string &amp; value)
  {
    values_.insert(value);
  }

  class iterator
  {
  public:
    iterator() {}

    iterator &amp; operator++()
    {
      it_++;
      return * this;
    }

    WrapSet &amp; operator*() const
    {
      return * it_;
    }

  private:
    iterator(const std::set&lt;std::string&gt; &amp; it)
      : it_(it) {}

    std::set&lt;std::string&gt;::iterator it_;
  };

  WrapSet::iterator begin()
  {
    return iterator(values_.begin());
  }

  WrapSet::iterator end()
  {
    return iterator(values_.end());
  }

private:
  std::set&lt;std::string&gt; values_;
};

int main()
{
  WrapSet ws;

  ws.insert(&quot;bla&quot;);

  for(WrapSet::iterator it = ws.begin(); it != ws.end(); it++)
  {
    std::cout &lt;&lt; *it &lt;&lt; std::endl;
  }
}
</code></pre>
<p>Die Fehler:</p>
<p>`# g++ WrapSet.h</p>
<p>WrapSet.h: In member function ‘WrapSet&amp; WrapSet::iterator::operator*() const’:</p>
<p>WrapSet.h:26: error: invalid initialization of reference of type ‘WrapSet&amp;’ from expression of type ‘const std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;’</p>
<p>... und noch 'ne Menge mehr`</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817300</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Thu, 03 Dec 2009 18:54:33 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 19:08:21 GMT]]></title><description><![CDATA[<p>Du solltest Const-Referenzen auf deine Objekte zurückgeben. Beim <code>std::set</code> kann es klug sein, gar keinen schreibenden Zugriff zu erlauben. Gerade wenn ein <code>std::string</code> verändert wird, wird die Sortierordung von <code>std::set</code> mit grosser Wahrscheinlichkeit durcheinandergebracht, was in undefiniertem Verhalten resultieren kann.</p>
<p>Zudem solltest du für den Iterator einen Konstruktor anbieten, welcher eine Initialisierung mit Werten aus <code>begin()</code> und <code>end()</code> erlaubt. Dasselbe gilt für den Zuweisungsoperator.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817308</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 03 Dec 2009 19:08:21 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 19:15:24 GMT]]></title><description><![CDATA[<p>Werde ich gerne tun (const_iterator) aber zuerst benötige ich ein lauffähiges Minimalbsp.</p>
<p>Kann jemand sagen wo der Fehler in meinem Bsp. liegt das es nicht kompiliert?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817312</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Thu, 03 Dec 2009 19:15:24 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 19:21:29 GMT]]></title><description><![CDATA[<p>goran schrieb:</p>
<blockquote>
<p>Kann jemand sagen wo der Fehler in meinem Bsp. liegt das es nicht kompiliert?</p>
</blockquote>
<p>Habe ich doch schon. Gib Const-Referenzen zurück und schreibe einen Konstruktor.</p>
<p>goran schrieb:</p>
<blockquote>
<p>Werde ich gerne tun (const_iterator) aber zuerst benötige ich ein lauffähiges Minimalbsp.</p>
</blockquote>
<p>Ich habe diese Dinge gesagt, um dein Beispiel lauffähig zu machen. Das ist nicht irgendein Geschwafel von irrelevanter Theorie. <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/1817316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817316</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 03 Dec 2009 19:21:29 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 19:37:34 GMT]]></title><description><![CDATA[<p>Verstehe ich schon (oder seit deinem vorletzten Posting). Ich interpretiere &quot;sollte&quot; als &quot;kann man, muss man nicht&quot;. Hättest du &quot;musst&quot; geschrieben hätte ich dich sofort verstanden.</p>
<p>Aber über eine kleine Zeile Code bzgl. des Konstruktors und des dann notwendigen operator= wäre ich dankbar. Hier bei mir kommt nur Murks raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817327</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Thu, 03 Dec 2009 19:37:34 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 20:28:38 GMT]]></title><description><![CDATA[<p>goran schrieb:</p>
<blockquote>
<p>Ich interpretiere &quot;sollte&quot; als &quot;kann man, muss man nicht&quot;. Hättest du &quot;musst&quot; geschrieben hätte ich dich sofort verstanden.</p>
</blockquote>
<p>Stimmt, wäre vielleicht etwas klarer gewesen. <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>
<p>goran schrieb:</p>
<blockquote>
<p>Aber über eine kleine Zeile Code bzgl. des Konstruktors und des dann notwendigen operator= wäre ich dankbar. Hier bei mir kommt nur Murks raus.</p>
</blockquote>
<p>Okay. Hier hast du das <code>::iterator</code> im Parametertypen vergessen. <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 />
Const-Referenz lohnt sich bei Iteratoren im Allgemeinen nicht, da diese üblicherweise sehr klein sind.</p>
<pre><code class="language-cpp">WrapSet::iterator::iterator(std::set&lt;std::string&gt;::iterator it)
: it_(it)
{
}
</code></pre>
<p>Wenn du einen impliziten Konstruktor (wie hier, ohne Schlüsselwort <code>explicit</code> ) hast, brauchst du eigentlich keinen Zuweisungsoperator mehr. Bei einer Zuweisung von einem <code>std::set&lt;std::string&gt;::iterator</code> würde dann ein temporäres <code>iterator</code> -Objekt erstellt werden, und dieses könnte der Default-Zuweisungsoperator zuweisen.</p>
<p>Aber fang am besten gar nicht erst an, einen Schreibzugriffs-Iterator bereitzustellen. Wechsle gleich auf <code>const_iterator</code> , dann brauchst du auch weniger überladene Methoden und einiges wird einfacher und vor allem sicherer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817352</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 03 Dec 2009 20:28:38 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 20:55:37 GMT]]></title><description><![CDATA[<p><code>(typename std::set&lt;std::string&gt;::iterator it)</code><br />
<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 />
ich will wieder stackende [ c] und [ b]`s <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>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817381</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 03 Dec 2009 20:55:37 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 21:20:18 GMT]]></title><description><![CDATA[<p>Danke sehr für die Hilfe.</p>
<p>Bis hierhin sieht meine WrapSet.c so aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;set&gt;

class WrapSet
{
public:
  class const_iterator
  {
  public:
    const_iterator() {}
    const_iterator(std::set&lt;std::string&gt;::const_iterator internal_iterator)
      : internal_iterator_(internal_iterator) {}

    const_iterator &amp; operator++(int i)
    {
      ++internal_iterator_;
      return * this;
    }

    const_iterator &amp; operator=(const const_iterator ci)
    {
      internal_iterator_ = ci.internal_iterator_;
    }

    const std::string &amp; operator*()
    {
      return *internal_iterator_;
    }

    bool operator!=(const const_iterator ci)
    {
      if(internal_iterator_ == ci.internal_iterator_)
        return true;
      else
        return false;
    }

  private:
    std::set&lt;std::string&gt;::const_iterator internal_iterator_;
  };

  void insert(const std::string &amp; value)
  {
    values_.insert(value);
  }

  const_iterator begin()
  {
    return const_iterator(values_.begin());
  }

  const_iterator end()
  {
    return const_iterator(values_.end());
  }

private:
  std::set&lt;std::string&gt; values_;
};

int main()
{
  WrapSet ws;

  ws.insert(&quot;bla&quot;);

  for(WrapSet::const_iterator i=ws.begin(); i!=ws.end(); i++)
    std::cout &lt;&lt; *i &lt;&lt; std::endl;
}
</code></pre>
<p>Natürlich habe ich wieder Fragen dazu:</p>
<p>Zeile 12:<br />
In meinem Ausgangs-Bsp. war der Konstruktor in dieser Zeile privat. War das falsch? Ich habe ihn nach public verschoben.</p>
<p>Zeile 15:<br />
Die Rückgabe ist eine Referenz. Ist es besser ohne Referenz? Und weiter, wieso benötigt der operator++ ein int übergeben?</p>
<p>Zeile 21:<br />
Wie in Zeile 15. Ist keine Referenz besser?</p>
<p>Zeile 48+53:<br />
Wie in Zeilen 21 und 15 nur umgekehrt. Diesmal keine Referenzen. Was ist besser?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817396</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Thu, 03 Dec 2009 21:20:18 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 21:22:17 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class WrapSet
{
public:
  class const_iterator
  {
  public:
    const_iterator()
    {}

    const_iterator(std::set&lt;std::string&gt;::const_iterator val)
    : internal_iterator_(val)
    {}

    const_iterator&amp; operator++()
    {
      ++internal_iterator_;
    }

    const_iterator operator++(int i) 
    {
      const_iterator nrvo(*this);
      ++*this; 
      return nrvo;
    }

    const std::string&amp; operator*()
    {
      return *internal_iterator_;
    }

  private: 
    std::set&lt;std::string&gt;::const_iterator internal_iterator_; 
  }; 

  void insert(const std::string&amp; value)
  {
    values_.insert(value);
  }

  const_iterator begin()
  {
    return values_.begin();
  }

  const_iterator end()
  {
    return values_.end();
  }

private:
  std::set&lt;std::string&gt; values_;
};
</code></pre>
<p>so sollte es stimmen...</p>
<blockquote>
<p>Zeile 12:<br />
In meinem Ausgangs-Bsp. war der Konstruktor in dieser Zeile privat. War das falsch? Ich habe ihn nach public verschoben.</p>
</blockquote>
<p>Jopp - private ctor an sich ist nciht falsch.<br />
ich würd so ne ctor`s private machen und die umschließende klasse als friend eintragen</p>
<blockquote>
<p>Zeile 15:<br />
Die Rückgabe ist eine Referenz. Ist es besser ohne Referenz? Und weiter, wieso benötigt der operator++ ein int übergeben?</p>
</blockquote>
<p><code>bei op++(int)</code> geht es nicht, eine referenz zurückzugeben</p>
<blockquote>
<p>Zeile 21:<br />
Wie in Zeile 15. Ist keine Referenz besser?</p>
</blockquote>
<p>ne, hier wäre die referenz richtig gewesen<br />
es hätte aber noch das <code>return *this;</code> gefehlt.<br />
nichts anderes macht aber der vom compiler automatisch generierte op= schon - also ersparen wir uns die tipp-arbeit doch...^^</p>
<blockquote>
<p>Zeile 48+53:<br />
Wie in Zeilen 21 und 15 nur umgekehrt. Diesmal keine Referenzen. Was ist besser?</p>
</blockquote>
<p>referenzen auf lokale objekte gehen ins auge - hier musst du per value zurückgeben...</p>
<p>bb :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817405</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 03 Dec 2009 21:22:17 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 21:34:46 GMT]]></title><description><![CDATA[<p>Jo, besten Dank. Jetzt läuft er.</p>
<p>Eine (oder zwei) Frage(n) noch.</p>
<p>Dein op++(int) benutzt 'ne Hilfsvar. Warum?</p>
<p>Und was ist das überhaupt, ein op++(int). Gibt's da ein Stichwort? Dann schau ich gerne selber nach.</p>
<p>Danke und Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817423</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Thu, 03 Dec 2009 21:34:46 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Thu, 03 Dec 2009 21:47:10 GMT]]></title><description><![CDATA[<p>Das ist für die Unterscheidung von Pre/Postinkrement.</p>
<p>Hier sollte das im entsprechenden Abschnitt erklärt sein:<br />
<a href="http://magazin.c-plusplus.net/artikel/%DCberladung%20von%20Operatoren%20in%20CPlusPlus%20%28Teil%201%29" rel="nofollow">http://magazin.c-plusplus.net/artikel/�berladung von Operatoren in CPlusPlus (Teil 1)</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817433</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 03 Dec 2009 21:47:10 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Fri, 04 Dec 2009 11:31:42 GMT]]></title><description><![CDATA[<p>So, jetzt habe ich eine SetWrap-Klasse die templates unterstützt.</p>
<p>Zu Anfang lief es noch nicht und in diesem Beitrag waren die Fehler samt meinen Fragen beschrieben. Um den Thread aber nicht unnötig aufzublähen (wg. des Quellcodes) habe ich mich entschlossen diesen zu editieren.</p>
<p>Der Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;set&gt;

template &lt;class T&gt;
class WrapSet
{
public:
  class const_iterator
  {
  public:
    const_iterator();

    const_iterator &amp; operator++();
    const_iterator operator++(int);
    const T &amp; operator*();
    bool operator!=(const const_iterator ci);

    friend class WrapSet;

  private:
    const_iterator(typename std::set&lt;T&gt;::const_iterator cit);

    typename std::set&lt;T&gt;::const_iterator cit_;
  };

  void insert(const T &amp; value);
  const_iterator begin();
  const_iterator end();

private:
  std::set&lt;T&gt; values_;
};

template &lt;class T&gt;
WrapSet&lt;T&gt;::const_iterator::const_iterator()
{
}

template &lt;class T&gt;
WrapSet&lt;T&gt;::const_iterator::const_iterator(typename std::set&lt;T&gt;::const_iterator cit)
  : cit_(cit)
{
}

template &lt;class T&gt;
typename WrapSet&lt;T&gt;::const_iterator &amp;
WrapSet&lt;T&gt;::const_iterator::operator++()
{
  ++cit_;
  return * this;
}

template &lt;class T&gt;
typename WrapSet&lt;T&gt;::const_iterator
WrapSet&lt;T&gt;::const_iterator::operator++(int)
{
  const_iterator tmp(*this);
  ++(*this);
  return tmp;
}

template &lt;class T&gt;
const T &amp;
WrapSet&lt;T&gt;::const_iterator::operator*()
{
  return * cit_;
}

template &lt;class T&gt;
bool
WrapSet&lt;T&gt;::const_iterator::operator!=(const WrapSet&lt;T&gt;::const_iterator ci)
{
  return !(cit_ == ci.cit_);
}

template &lt;class T&gt;
void
WrapSet&lt;T&gt;::insert(const T &amp; value)
{
  values_.insert(value);
}

template &lt;class T&gt;
typename WrapSet&lt;T&gt;::const_iterator
WrapSet&lt;T&gt;::begin()
{
  return WrapSet&lt;T&gt;::const_iterator(values_.begin());
}

template &lt;class T&gt;
typename WrapSet&lt;T&gt;::const_iterator
WrapSet&lt;T&gt;::end()
{
  return WrapSet&lt;T&gt;::const_iterator(values_.end());
}

int main()
{
  WrapSet&lt;std::string&gt; ws;

  ws.insert(&quot;bla&quot;);

  for(WrapSet&lt;std::string&gt;::const_iterator i=ws.begin(); i!=ws.end(); i++)
    std::cout &lt;&lt; *i &lt;&lt; std::endl;
}
</code></pre>
<p>Eine Frage zu <em>typename</em> habe ich noch. Nur aufgrund von try &amp; error habe ich typename in den Zeilen 22, 24, 41, 47, 55, 85 und 92 genutzt. Was ist der Grund das <em>typename</em> benötigt wird?</p>
<p>Danke und Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817741</guid><dc:creator><![CDATA[goran]]></dc:creator><pubDate>Fri, 04 Dec 2009 11:31:42 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Fri, 04 Dec 2009 12:22:58 GMT]]></title><description><![CDATA[<p>Ohne 'typename ' würde der Compiler bei</p>
<pre><code class="language-cpp">std::set&lt;T&gt;::const_iterator
</code></pre>
<p>'const_iterator' als Name einer Klassenvariablen annehmen, d.h. typename braucht man immer bei verschachtelten Typ-Zugriffen mit Templates.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817793</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Fri, 04 Dec 2009 12:22:58 GMT</pubDate></item><item><title><![CDATA[Reply to STL-Container wrappen zwecks eigener Iteratoren on Fri, 04 Dec 2009 16:34:37 GMT]]></title><description><![CDATA[<p>speziell op!= würde ich nicht als member deklarieren.<br />
die definition ist auch höchst eigenartig <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=";D"
      alt="😉"
    /></p>
<p><code>friend class WrapSet;</code><br />
das class ist imho unnötig - und ich würd das entweder ganz oben oder ganz unten hinschreiben, aber nicht unter die fkt. mischen</p>
<p><code>const T &amp; operator*();</code><br />
für <code>const T&amp;</code> gibt es schon fertige typedefs...<br />
(das gleiche bei <code>void insert(const T &amp; value);</code> )</p>
<p>bei der implementierung wäre ein wenig ordnung wünschenswert ;o)<br />
(und in echt würd ich das auf jeden fall in ne *.impl datei auslagern, damit der header wirklich nur für die dokumentation dient)</p>
<p><code>const_iterator &amp; operator++();</code> , <code>return * this;</code> , ...<br />
die leerzeichen zwischen typ und &amp; bzw * find ich eher verwirrend, aber wenn du damit besser zurecht kommst, kannst du es auch so lassen...</p>
<p><code>typename std::set&lt;T&gt;::const_iterator</code><br />
dafür könnte man btw noch nen (privates) typedef á la <code>internal_iter</code> anlegen...</p>
<p><code>for(WrapSet&lt;std::string&gt;::const_iterator i=ws.begin(); i!=ws.end(); i++)</code><br />
das man nicht jedes mal wieder <code>end()</code> aufruft, ist dir bekannt und du hast es nur hier so gemacht!?<br />
ich würd so was hier schreiben:<br />
<code>for(WrapSet&lt;std::string&gt;::const_iterator i(ws.begin()), e(ws.end()); i != e; ++i)</code></p>
<p>(die ausgabe geht mittels <code>std::copy</code> und <code>std::ostream_iterator</code> auch einfacher(oder zumindest kürzer^^), aber das soll hier nicht das thema sein^^)</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817946</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 04 Dec 2009 16:34:37 GMT</pubDate></item></channel></rss>