<?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[Konstruktoraufruf mit Iteratoren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein STL-Set in einer eigenen Klasse mySet gekapselt, da ich dem Set ein paar Extrafunktionen spendieren wollte.</p>
<p>Um die Initialisierung per Iteratoren möglich zu machen, habe ich folgenden Konstruktor für mySet geschrieben:</p>
<pre><code>mySet(it_t first, it_t last) : content(set&lt;t&gt;(first, last))  {}
</code></pre>
<p>(es gilt it_t = set&lt;t&gt;::iterator)</p>
<p>Der Aufruf dafür wäre:</p>
<pre><code>mySet&lt;char&gt; charSet(charArray, charArray+5);
</code></pre>
<p>Er schlägt fehl weil:</p>
<pre><code>error: no matching function for call to ‘mySet&lt;char&gt;::mySet(char [5], char*)
</code></pre>
<p>Ergo die Funktion wird nicht gefunden.</p>
<p>Die offensichtliche &quot;Lösung&quot; ist jetzt, einen Konstruktor der Art &quot;mySet(char*, char*)..&quot; zu schreiben, aber das ist ja dann nicht generisch. Kriegt man das ganze auch generisch hin? Vielen Dank für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263560/konstruktoraufruf-mit-iteratoren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 16:10:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263560.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Mar 2010 19:25:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktoraufruf mit Iteratoren on Mon, 22 Mar 2010 19:25:56 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein STL-Set in einer eigenen Klasse mySet gekapselt, da ich dem Set ein paar Extrafunktionen spendieren wollte.</p>
<p>Um die Initialisierung per Iteratoren möglich zu machen, habe ich folgenden Konstruktor für mySet geschrieben:</p>
<pre><code>mySet(it_t first, it_t last) : content(set&lt;t&gt;(first, last))  {}
</code></pre>
<p>(es gilt it_t = set&lt;t&gt;::iterator)</p>
<p>Der Aufruf dafür wäre:</p>
<pre><code>mySet&lt;char&gt; charSet(charArray, charArray+5);
</code></pre>
<p>Er schlägt fehl weil:</p>
<pre><code>error: no matching function for call to ‘mySet&lt;char&gt;::mySet(char [5], char*)
</code></pre>
<p>Ergo die Funktion wird nicht gefunden.</p>
<p>Die offensichtliche &quot;Lösung&quot; ist jetzt, einen Konstruktor der Art &quot;mySet(char*, char*)..&quot; zu schreiben, aber das ist ja dann nicht generisch. Kriegt man das ganze auch generisch hin? Vielen Dank für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872670</guid><dc:creator><![CDATA[xorand]]></dc:creator><pubDate>Mon, 22 Mar 2010 19:25:56 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoraufruf mit Iteratoren on Mon, 22 Mar 2010 19:32:50 GMT]]></title><description><![CDATA[<p>mach ein Template draus:</p>
<pre><code class="language-cpp">template &lt;class Iter&gt;
mySet(Iter first, Iter last) : content(first, last)  {}
</code></pre>
<p>ich nehme mal an, dass conten ein set&lt;T&gt; ist, da brauchste nicht n temporäres von zu erzeugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872674</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 22 Mar 2010 19:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoraufruf mit Iteratoren on Mon, 22 Mar 2010 19:49:29 GMT]]></title><description><![CDATA[<p>Du könntest auch einen eigenen Iterator anbieten, der die entsprechenden Konvertierungen besitzt. Hier mal am Beispiel eines erweiterten vectors:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; struct my_vector: public vector&lt;T&gt;
{
  struct iterator
  {
    iterator(T* foo){}
  };
  my_vector(iterator beg,iterator end)
  {
    // Irgendwas
  }
};

int main () {
  char foo[6];
  my_vector&lt;char&gt; bar(foo,foo+5);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1872683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872683</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 22 Mar 2010 19:49:29 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoraufruf mit Iteratoren on Wed, 24 Mar 2010 15:02:25 GMT]]></title><description><![CDATA[<p>Vielen Dank schon mal, die Lösung von Pumuckl kompiliert.</p>
<p>Einen Wermutstropfen gibt es da aber, denn zur Compilezeit übernimmt dieser Konstruktor dann Aufrufe durch beliebige Typen. D.h. folgendes wäre möglich:</p>
<pre><code>int integers[] = {0,1,2};
mySet&lt;char&gt;(integers, integers+2);
</code></pre>
<p>Der Vorschlag von SeppJ habe ich versucht einzubinden, indem ich nur das Snippet zu meiner bestehenden Klasse hinzugefügt habe:</p>
<pre><code>struct iterator {
    iterator(T* foo){}
};
</code></pre>
<p>Leider wirft der Compiler bei der mittleren Zeile einige Fehler (z.B. /usr/include/c++/4.3/bits/stl_tree.h:1295: error: no match for ‘operator*’ in ‘*__first’)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873370</guid><dc:creator><![CDATA[xorand]]></dc:creator><pubDate>Wed, 24 Mar 2010 15:02:25 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoraufruf mit Iteratoren on Wed, 24 Mar 2010 15:11:25 GMT]]></title><description><![CDATA[<p>xorand schrieb:</p>
<blockquote>
<p>Der Vorschlag von SeppJ habe ich versucht einzubinden, indem ich nur das Snippet zu meiner bestehenden Klasse hinzugefügt habe:</p>
<pre><code>struct iterator {
    iterator(T* foo){}
};
</code></pre>
<p>Leider wirft der Compiler bei der mittleren Zeile einige Fehler (z.B. /usr/include/c++/4.3/bits/stl_tree.h:1295: error: no match for ‘operator*’ in ‘*__first’)</p>
</blockquote>
<p>Das liegt daran, weil ich nur ein unvollständiges Beispiel geliefert habe. Du musst die zu einem Iterator gehörenden Methoden schon implementieren oder erben, damit das funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873373</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 24 Mar 2010 15:11:25 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoraufruf mit Iteratoren on Wed, 24 Mar 2010 15:15:28 GMT]]></title><description><![CDATA[<p>xorand schrieb:</p>
<blockquote>
<p>Einen Wermutstropfen gibt es da aber, denn zur Compilezeit übernimmt dieser Konstruktor dann Aufrufe durch beliebige Typen. D.h. folgendes wäre möglich:</p>
<pre><code>int integers[] = {0,1,2};
mySet&lt;char&gt;(integers, integers+2);
</code></pre>
</blockquote>
<p>Ist doch wunderbar dass das geht. Sind ja auch Iteratoren, und warum sollte man es hier anders machen als die STL und auf bestimmte Iteratorentypen beschränken?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873375</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 24 Mar 2010 15:15:28 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoraufruf mit Iteratoren on Wed, 24 Mar 2010 16:57:54 GMT]]></title><description><![CDATA[<p>xorand schrieb:</p>
<blockquote>
<p>Vielen Dank schon mal, die Lösung von Pumuckl kompiliert.</p>
<p>Einen Wermutstropfen gibt es da aber, denn zur Compilezeit übernimmt dieser Konstruktor dann Aufrufe durch beliebige Typen. D.h. folgendes wäre möglich:</p>
<pre><code>int integers[] = {0,1,2};
mySet&lt;char&gt;(integers, integers+2);
</code></pre>
</blockquote>
<p>Wäre es. Und es würde die ints in chars konvertieren, so wie mans erwartet. Wenn du wirklich nur Iteratoren auf char haben möchtest, geht das auch. Festhalten:</p>
<pre><code class="language-cpp">#include &lt;boost/type_traits/is_same.hpp&gt;
#include &lt;boost/utility/enable_if.hpp&gt;
#include &lt;iterator&gt;

/* ... */

template &lt;class T&gt;
class mySet
{
  template &lt;class Iter&gt;
  struct IterValueTypeIsT : public boost::is_same&lt;typename std::iterator_traits&lt;Iter&gt;::value_type, T&gt;
  {};

public:
  template &lt;class Iter&gt;
  mySet(Iter first, boost::enable_if&lt;IterValueTypeIsT&lt;Iter&gt;, Iter&gt;::type last) : content(first, last)  {}

/* ... */
};
</code></pre>
<p>Zur Erklärung: IterValueTypeIsT erbt entweder von boost::true_type oder boost::false_type, je nachdem ob der value_type von Iter ein T ist oder nicht. Dazu muss std::iterator_traits&lt;Iter&gt; compilieren, d.h. entweder Iter hat ein member-typedef value_type oder ist ein Pointer oder std::iterator_traits wurde entsprechend spezialisiert.<br />
enable_if compiliert nur wenn IterValueTypeIsT von true_type erbt, in dem Fall ist der membertypedef type gleich dem zweiten templateparameter, also hier Iter.<br />
Das ganze Konstrukt compiliert also genau dann wenn std::iterator_traits&lt;Iter&gt;::value_type T ergibt und ist dann genau das gleiche was ich vorher schon vorgeschlagen hatte <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: das ::type gehörte ans enable_if, nicht ans IterValueTypeIsT</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873384</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 24 Mar 2010 16:57:54 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktoraufruf mit Iteratoren on Wed, 24 Mar 2010 15:31:12 GMT]]></title><description><![CDATA[<p>Super, das war was ich wollte. Vielen Dank für die schnellen Antworten. Boost ftw <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/1873391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873391</guid><dc:creator><![CDATA[xorand]]></dc:creator><pubDate>Wed, 24 Mar 2010 15:31:12 GMT</pubDate></item></channel></rss>