<?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[Templates: Ist das erlaubt?]]></title><description><![CDATA[<p>in einem Buch hab ich folgenden Code gesehen:</p>
<pre><code class="language-cpp">template&lt;class Iterator&gt;
Iterator::difference_type operator-(Iterator second,
Iterator first) {
Iterator::difference_type count = 0; // Typ enspricht z.B. int
/*Die Differenz wird ermittelt, indem first weitergeschaltet wird, bis der Iterator
second erreicht ist. Voraussetzung ist also, dass first nicht nach dem Iterator
second liegt. Anders gesagt: Der Iterator second muss ggf. für first mit dem
Operator ++ erreichbar sein.
*/
while(first != second
&amp;&amp; first != Iterator()) {
++first;
++count;
}
// bei Ungleichheit ist second von first aus mit ++ nicht erreichbar.
assert(current == fromWhere.current);
return count;
}
</code></pre>
<p>im obigen Template wird ja der Datentyp Iterator::difference_type verwendet - ist das überhaupt so erlaubt... woher soll den der Compiler wissen, das der Iterator einen difference_type mitbringt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/168070/templates-ist-das-erlaubt</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 06:03:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/168070.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 18 Dec 2006 12:11:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates: Ist das erlaubt? on Mon, 18 Dec 2006 12:11:45 GMT]]></title><description><![CDATA[<p>in einem Buch hab ich folgenden Code gesehen:</p>
<pre><code class="language-cpp">template&lt;class Iterator&gt;
Iterator::difference_type operator-(Iterator second,
Iterator first) {
Iterator::difference_type count = 0; // Typ enspricht z.B. int
/*Die Differenz wird ermittelt, indem first weitergeschaltet wird, bis der Iterator
second erreicht ist. Voraussetzung ist also, dass first nicht nach dem Iterator
second liegt. Anders gesagt: Der Iterator second muss ggf. für first mit dem
Operator ++ erreichbar sein.
*/
while(first != second
&amp;&amp; first != Iterator()) {
++first;
++count;
}
// bei Ungleichheit ist second von first aus mit ++ nicht erreichbar.
assert(current == fromWhere.current);
return count;
}
</code></pre>
<p>im obigen Template wird ja der Datentyp Iterator::difference_type verwendet - ist das überhaupt so erlaubt... woher soll den der Compiler wissen, das der Iterator einen difference_type mitbringt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193928</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Mon, 18 Dec 2006 12:11:45 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Ist das erlaubt? on Mon, 18 Dec 2006 12:25:31 GMT]]></title><description><![CDATA[<p>Also prinzipiell dürfte das erlaubt sein (besser wäre es, den Rückgabetyp als &quot;typename Iterator::difference_type&quot; anzugeben). Der Compiler überprüft zunächst nur, ob alles syntaktisch korrekt ist (und nimmt an, daß Iterator einen difference_type kennt). Erst wenn er eine Spzialisierung dieser Funktion anlegt, kannst du Probleme bekommen (no matching definition oder so ähnlich).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193937</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 18 Dec 2006 12:25:31 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Ist das erlaubt? on Mon, 18 Dec 2006 12:30:12 GMT]]></title><description><![CDATA[<p>lol - Visual Studio 2005 will es nicht übersetzen und g++ weigert sich auch... mmh...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193940</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Mon, 18 Dec 2006 12:30:12 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Ist das erlaubt? on Mon, 18 Dec 2006 12:31:20 GMT]]></title><description><![CDATA[<p>Ne Fehlermeldung wäre sinvoller =o)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193942</guid><dc:creator><![CDATA[Knuddlbaer]]></dc:creator><pubDate>Mon, 18 Dec 2006 12:31:20 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Ist das erlaubt? on Mon, 18 Dec 2006 12:32:34 GMT]]></title><description><![CDATA[<p>Vertexwahn schrieb:</p>
<blockquote>
<p>in einem Buch hab ich folgenden Code gesehen:</p>
<pre><code class="language-cpp">template&lt;class Iterator&gt;
Iterator::difference_type operator-(Iterator second,
Iterator first) {
Iterator::difference_type count = 0; // Typ enspricht z.B. int
/*Die Differenz wird ermittelt, indem first weitergeschaltet wird, bis der Iterator
second erreicht ist. Voraussetzung ist also, dass first nicht nach dem Iterator
second liegt. Anders gesagt: Der Iterator second muss ggf. für first mit dem
Operator ++ erreichbar sein.
*/
while(first != second
&amp;&amp; first != Iterator()) {
++first;
++count;
}
// bei Ungleichheit ist second von first aus mit ++ nicht erreichbar.
assert(current == fromWhere.current);
return count;
}
</code></pre>
<p>im obigen Template wird ja der Datentyp Iterator::difference_type verwendet - ist das überhaupt so erlaubt...</p>
</blockquote>
<p>Es ist nicht verboten, schränkt aber möglicherweise den Templateparameter ein.</p>
<blockquote>
<p>woher soll den der Compiler wissen, das der Iterator einen difference_type mitbringt?</p>
</blockquote>
<p>Tut er nicht, im Übrigen fehlt dort auf jeden Fall ein typename. Zwecks allgemeingültigkeit <em>verlangt</em> der Standard, dass Iteratoren eine eigene Spezialisierung von iterator_traits mitbringen, wenn das Primärtemplate nicht genügt. An dieser Stelle kommt dann wieder diese verschachtelte Deklaration zum Tragen: Das Primärtemplate von iterator_traits verweist nähmlich auf entsprechende Member des zu beschreibenden Iterators. Hat man also diese nested member im Iterator deklariert, erübrigt sich eine Spezialisierung von iterator_traits. Und weil das so ist, wird man kaum Iteratoren begegnen, die diese Definition nicht haben. So gesehen benötigt man iterator_traits nur, wenn möglicherweise Pointer im Spiel sind, verlässt sich dann aber auf etwas, dass vom Standard nicht garantiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193943</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 18 Dec 2006 12:32:34 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Ist das erlaubt? on Mon, 18 Dec 2006 12:45:34 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>tut er nicht, im Übrigen fehlt dort auf jeden Fall ein typename</p>
</blockquote>
<p>wo fehlt ein typename?</p>
<p>Knuddlbaer schrieb:</p>
<blockquote>
<p>Ne Fehlermeldung wäre sinvoller =o)</p>
</blockquote>
<p>Warning 1 warning C4346: 'Iterator::difference_type' : dependent name is not a type c:\dokumente und einstellungen\julian\desktop\stl\stl\slist.h 96<br />
Error 2 error C2143: syntax error : missing ';' before '-' c:\dokumente und einstellungen\julian\desktop\stl\stl\slist.h 96<br />
Error 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\dokumente und einstellungen\julian\desktop\stl\stl\slist.h 96<br />
Error 4 error C2888: 'Iterator::difference_type difference_type' : symbol cannot be defined within namespace 'br_stl' c:\dokumente und einstellungen\julian\desktop\stl\stl\slist.h 96<br />
Error 5 fatal error C1903: unable to recover from previous error(s); stopping compilation c:\dokumente und einstellungen\julian\desktop\stl\stl\slist.h 96</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193949</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Mon, 18 Dec 2006 12:45:34 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Ist das erlaubt? on Mon, 18 Dec 2006 12:55:11 GMT]]></title><description><![CDATA[<p>Jeweils vor <em>Iterator::difference_type</em> muss <em>typename</em> stehen, damit der Compiler weiß, dass es sich um ein <em>typedef</em> handelt. Der Compiler glaubt sonst, dass <em>difference_type</em> eine statische Variable in <em>Iterator</em> ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193959</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Mon, 18 Dec 2006 12:55:11 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Ist das erlaubt? on Mon, 18 Dec 2006 13:00:18 GMT]]></title><description><![CDATA[<p>schorsch code schrieb:</p>
<blockquote>
<p>Jeweils vor <em>Iterator::difference_type</em> muss <em>typename</em> stehen, damit der Compiler weiß, dass es sich um ein <em>typedef</em> handelt. Der Compiler glaubt sonst, dass <em>difference_type</em> eine statische Variable in <em>Iterator</em> ist.</p>
</blockquote>
<p>... was dann wiederum die Fehlermeldung erklärt. <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>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193965</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 18 Dec 2006 13:00:18 GMT</pubDate></item><item><title><![CDATA[Reply to Templates: Ist das erlaubt? on Mon, 18 Dec 2006 13:16:32 GMT]]></title><description><![CDATA[<p>schorsch code schrieb:</p>
<blockquote>
<p>Jeweils vor <em>Iterator::difference_type</em> muss <em>typename</em> stehen, damit der Compiler weiß, dass es sich um ein <em>typedef</em> handelt. Der Compiler glaubt sonst, dass <em>difference_type</em> eine statische Variable in <em>Iterator</em> ist.</p>
</blockquote>
<p>Danke! genau das wars!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1193979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193979</guid><dc:creator><![CDATA[Vertexwahn]]></dc:creator><pubDate>Mon, 18 Dec 2006 13:16:32 GMT</pubDate></item></channel></rss>