<?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[eigener &#x27;Checked Iterator&#x27; in Visual C++]]></title><description><![CDATA[<p>Unter 'Visual C++' (ca. ab 8.0) gibt es das Konzept von <a href="http://msdn.microsoft.com/en-us/library/aa985965%28VS.80%29.aspx" rel="nofollow">'Checked Iterators'</a>, was ganz hilfreich ist, aber den unangenehmen Seiteneffekt hat, dass selbst geschriebene Iteratoren dort nicht ohne weiteres drunter fallen.</p>
<p>Ganz konkret hab ich einen selbst geschriebenen Output-Iterator, den ich an den copy-Algorithmus übergebe. Und bekomme beim Compilieren die Warnung: &quot;warning C4996: 'std::copy': Function call with parameters that may be unsafe - ..&quot;.</p>
<p>Frage: wie muss ich meinem Iterator erweitern, damit diese Warnung nicht mehr kommt?</p>
<p>Bis jetzt hab ich nur herausgefunden, dass es dort ein #define _IF_CHK gibt und man es über Spezialisierungen von std::_Is_checked_iterator und std::_Checked_iterator_category hinkriegen sollte (alles in &lt;xutility&gt;). Aber bis jetzt ist es mir nicht gelungen. Und diese komische Firma aus Redmond scheint auch nicht davon auszugehen, dass jemand seine eigenen Iteratoren schreibt ... also muss man das auch nicht dokumentieren - oder!?</p>
<p>Ach ja: mein Iterator ist auch ein Template (wie sollte es auch anders sein).</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/252548/eigener-checked-iterator-in-visual-c</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 08:29:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/252548.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 21 Oct 2009 12:33:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to eigener &#x27;Checked Iterator&#x27; in Visual C++ on Wed, 21 Oct 2009 12:33:12 GMT]]></title><description><![CDATA[<p>Unter 'Visual C++' (ca. ab 8.0) gibt es das Konzept von <a href="http://msdn.microsoft.com/en-us/library/aa985965%28VS.80%29.aspx" rel="nofollow">'Checked Iterators'</a>, was ganz hilfreich ist, aber den unangenehmen Seiteneffekt hat, dass selbst geschriebene Iteratoren dort nicht ohne weiteres drunter fallen.</p>
<p>Ganz konkret hab ich einen selbst geschriebenen Output-Iterator, den ich an den copy-Algorithmus übergebe. Und bekomme beim Compilieren die Warnung: &quot;warning C4996: 'std::copy': Function call with parameters that may be unsafe - ..&quot;.</p>
<p>Frage: wie muss ich meinem Iterator erweitern, damit diese Warnung nicht mehr kommt?</p>
<p>Bis jetzt hab ich nur herausgefunden, dass es dort ein #define _IF_CHK gibt und man es über Spezialisierungen von std::_Is_checked_iterator und std::_Checked_iterator_category hinkriegen sollte (alles in &lt;xutility&gt;). Aber bis jetzt ist es mir nicht gelungen. Und diese komische Firma aus Redmond scheint auch nicht davon auszugehen, dass jemand seine eigenen Iteratoren schreibt ... also muss man das auch nicht dokumentieren - oder!?</p>
<p>Ach ja: mein Iterator ist auch ein Template (wie sollte es auch anders sein).</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1795779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1795779</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 21 Oct 2009 12:33:12 GMT</pubDate></item><item><title><![CDATA[Reply to eigener &#x27;Checked Iterator&#x27; in Visual C++ on Wed, 21 Oct 2009 12:39:22 GMT]]></title><description><![CDATA[<p>Leite von stdext::checked_iterator ab, anstatt von std::iterator.<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1795780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1795780</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 21 Oct 2009 12:39:22 GMT</pubDate></item><item><title><![CDATA[Reply to eigener &#x27;Checked Iterator&#x27; in Visual C++ on Wed, 21 Oct 2009 12:53:33 GMT]]></title><description><![CDATA[<p>Hallo Simon,<br />
.. die warning bleibt leider. Das macht keinen Unterschied.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1795790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1795790</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 21 Oct 2009 12:53:33 GMT</pubDate></item><item><title><![CDATA[Reply to eigener &#x27;Checked Iterator&#x27; in Visual C++ on Wed, 21 Oct 2009 16:14:13 GMT]]></title><description><![CDATA[<p>das hier mal versucht!?</p>
<p>&lt;a href= schrieb:</p>
<blockquote>
<p>MSDN&quot;&gt;</p>
<pre><code class="language-cpp">// C4996_b.cpp
// compile with: /EHsc /W1

#define _SECURE_SCL 1
#include &lt;algorithm&gt;

using namespace std;
using namespace stdext;

int main() {
   int a [] = {1, 2, 3};
   int b [] = {10, 11, 12};
   copy(a, a + 3, b);   // C4996
   copy(a, a + 3, checked_array_iterator&lt;int *&gt;(b, 3));   // OK
}
</code></pre>
</blockquote>
<p>ich würd btw einfach die 4996er warning deaktivieren... wäre einfacher und idR weiß ich selbst, welche Fkt ich aufrufen sollte und welche nicht <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>wenn du das nicht willst, kannst du ja mal gucken, ob <code>checked_array_iterator</code> im namespace stdext ist und ob du deinen iterator davon ableiten darfst ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1795882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1795882</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 21 Oct 2009 16:14:13 GMT</pubDate></item><item><title><![CDATA[Reply to eigener &#x27;Checked Iterator&#x27; in Visual C++ on Wed, 21 Oct 2009 17:59:36 GMT]]></title><description><![CDATA[<p>geht.</p>
<pre><code class="language-cpp">// iter.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include &quot;stdafx.h&quot;
#define _SECURE_SCL 1 
#include &lt;vector&gt;
#include &lt;xutility&gt;
#include &lt;iostream&gt;
using namespace std;

struct PrintIntIterator:public iterator&lt;output_iterator_tag,int&gt;{
	typedef _Range_checked_iterator_tag _Checked_iterator_category;//&lt;---
	int value;
	PrintIntIterator&amp; operator++(){
		cout&lt;&lt;value&lt;&lt;'\n';
		return *this;
	}
	int&amp; operator*(){
		return value;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	vector&lt;int&gt; vec;
	for(int i=0;i!=10;++i)
		vec.push_back(i*i);
	copy(vec.begin(),vec.end(),PrintIntIterator());
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1795939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1795939</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 21 Oct 2009 17:59:36 GMT</pubDate></item><item><title><![CDATA[Reply to eigener &#x27;Checked Iterator&#x27; in Visual C++ on Wed, 21 Oct 2009 20:45:20 GMT]]></title><description><![CDATA[<p>Danke Volkard,</p>
<p>so geht's tatsächlich <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>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796025</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 21 Oct 2009 20:45:20 GMT</pubDate></item><item><title><![CDATA[Reply to eigener &#x27;Checked Iterator&#x27; in Visual C++ on Wed, 21 Oct 2009 20:50:31 GMT]]></title><description><![CDATA[<p>Wäre nett, wenn Du Deinen Iterator mal zeigen würdest, wenn Du mit ihm zufrieden bist, damit ich zurücklerne.<br />
Ich hab ja nix gemacht, außer die SFINAE-Templates aufzudröseln, ohne zu wissen, was ich gemacht hab. Ich weiß aber nicht, wie man einen output iterator eigentlich ordentlich macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796028</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 21 Oct 2009 20:50:31 GMT</pubDate></item><item><title><![CDATA[Reply to eigener &#x27;Checked Iterator&#x27; in Visual C++ on Thu, 22 Oct 2009 08:00:44 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Wäre nett, wenn Du Deinen Iterator mal zeigen würdest, wenn Du mit ihm zufrieden bist, damit ich zurücklerne.</p>
</blockquote>
<p>Das ist kein Hexenwerk - ich hatte einfach frech den std::ostream_iterator aus &lt;iterator&gt; kopiert (allerdings schon vor Jahren, daher die Variante ohne Checked Iterator) und den Typ std::ostream durch einen <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1675962.html#1675962" rel="nofollow">eigenen binären Stream</a> ersetzt. (s. C++-Standard [lib.ostream.iterator] Kapitel 24.5.2)</p>
<pre><code class="language-cpp">#include &quot;obinstream.h&quot;
#include &lt;iterator&gt;

template&lt; class T &gt;
class obinstream_iterator
    : public std::iterator&lt; std::output_iterator_tag, void, void, void, void &gt;
{
public:
    typedef obinstream::char_type   char_type;
    typedef obinstream::traits_type traits_type;
	typedef obinstream              ostream_type;
#if _SECURE_SCL
    typedef std::_Range_checked_iterator_tag _Checked_iterator_category;
#endif

    explicit obinstream_iterator( ostream_type&amp; _O )
		: _Ostr(&amp;_O) {}
	obinstream_iterator&lt;T&gt;&amp; operator=( const T&amp; _X )
		{*_Ostr &lt;&lt; _X;
		return (*this); }
	obinstream_iterator&lt;T&gt;&amp; operator*()
		{return (*this); }
	obinstream_iterator&lt;T&gt;&amp; operator++()
		{return (*this); }
	obinstream_iterator&lt;T&gt; operator++(int)
		{return (*this); }

protected:
	ostream_type *_Ostr;
};
</code></pre>
<p>volkard schrieb:</p>
<blockquote>
<p>Ich hab ja nix gemacht, außer die SFINAE-Templates aufzudröseln, ohne zu wissen, was ich gemacht hab.</p>
</blockquote>
<p>Das war auch meine Vorgehensweise - ich hatte bloß beim Übersetzen aus Versehen zwei Dateien im Archiv vertauscht - also eine Datei geändert, aber eine andere compiliert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> . Daher fruchtete auch keine der Änderungen.</p>
<p>Falls Du mehr eigene Iteratoren schreiben willst, so kann ich Dir <a href="http://www.boost.org/doc/libs/1_40_0/libs/iterator/doc/index.html" rel="nofollow">boost.iterator</a> wärmstens empfehlen. Wenn man erstmal kapiert hat, wie <a href="http://www.boost.org/doc/libs/1_40_0/libs/iterator/doc/iterator_adaptor.html" rel="nofollow">iterator_adaptor</a> und <a href="http://www.boost.org/doc/libs/1_40_0/libs/iterator/doc/iterator_facade.html" rel="nofollow">iterator_facade</a> ticken, ist es echt genial.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796164</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 22 Oct 2009 08:00:44 GMT</pubDate></item><item><title><![CDATA[Reply to eigener &#x27;Checked Iterator&#x27; in Visual C++ on Thu, 22 Oct 2009 08:07:19 GMT]]></title><description><![CDATA[<p>Ich hatte das Schreiben in den op++ gelegt und wußte, daß das nicht ok ist. Daher meine Unsicherheit. Einen Proxy für den op= einsetzen wollte ich nicht gerade.</p>
<p>Dabei ist</p>
<pre><code class="language-cpp">obinstream_iterator&lt;T&gt;&amp; operator*() 
        {return (*this); }
</code></pre>
<p>so einfach. lol.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1796168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1796168</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 22 Oct 2009 08:07:19 GMT</pubDate></item></channel></rss>