<?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[compilerfehler bei iteratorenvergleich]]></title><description><![CDATA[<p>hola leute</p>
<p>folgendes scenario:</p>
<pre><code>volumes&lt;char&gt; vol;
   volumes&lt;char&gt;::iterator iter(vol), end;

   while(iter != end)
   {
      std::cout &lt;&lt; *iter++ &lt;&lt; std::endl;
   }
</code></pre>
<p>hier gibt es kein problem. wenn ich aber folgendes schreibe:</p>
<pre><code>volumes&lt;char&gt;::iterator iter(volumes&lt;char&gt;()), end;

   while(iter != end) // (22)
   {
      std::cout &lt;&lt; *iter++ &lt;&lt; std::endl;
   }
</code></pre>
<p>bekomm ich in zeile (22) folgende fehlermeldung:</p>
<pre><code>1&gt;main.cpp(22): error C2678: Binärer Operator '!=': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'overloaded-function' akzeptiert (oder keine geeignete Konvertierung möglich)
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\exception(522): kann 'bool std::operator !=(const std::exception_ptr &amp;,const std::exception_ptr &amp;)' sein [bei der Verwendung der argumentbezogenen Suche gefunden]
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\exception(527): oder &quot;bool std::operator !=(std::nullptr_t,const std::exception_ptr &amp;)&quot; [bei argumentbezogenem Lookup gefunden]
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\exception(532): oder &quot;bool std::operator !=(const std::exception_ptr &amp;,std::nullptr_t)&quot; [bei argumentbezogenem Lookup gefunden]
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\system_error(443): oder &quot;bool std::operator !=(const std::error_code &amp;,const std::error_condition &amp;) throw()&quot; [bei argumentbezogenem Lookup gefunden]
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\system_error(450): oder &quot;bool std::operator !=(const std::error_condition &amp;,const std::error_code &amp;) throw()&quot; [bei argumentbezogenem Lookup gefunden]
1&gt;          C:\Program Files (x86)\Windows Kits\8.0\Include\shared\guiddef.h(197): oder &quot;bool operator !=(const GUID &amp;,const GUID &amp;)&quot;
1&gt;          bei Anpassung der Argumentliste '(overloaded-function, txl::win::volume_iterator&lt;CHAR&gt;)'
1&gt;          with
1&gt;          [
1&gt;              CHAR=char
1&gt;          ]
1&gt;main.cpp(22): fatal error C1903: Weiterverarbeitung nach vorherigem Fehler nicht möglich; Kompilierung wird abgebrochen.
1&gt;
1&gt;Fehler beim Buildvorgang.
</code></pre>
<p>die volumes-klasse mit dem iterator sieht folgend aus:</p>
<pre><code>template&lt;class CHAR&gt;
class volumes;

template&lt;class CHAR&gt;
class volume_iterator : public std::iterator&lt;std::input_iterator_tag, std::basic_string&lt;CHAR&gt; &gt;
{
   public:
      typedef CHAR char_type;

      template&lt;class&gt; friend class volumes;

      volume_iterator(const volumes&lt;char_type&gt; &amp;v)
      {
         v(*this);
      }

      volume_iterator(void)
      {

      }

      ~volume_iterator(void)
      {
         if(m_handle != txl::win::handle())
            ::FindVolumeClose(m_handle.native_handle());
      }

      std::basic_string&lt;char_type&gt;&amp; operator*(void) 
      {
         return m_str;
      }

      volume_iterator&amp; operator++(void)
      {
         char_type buffer[MAX_PATH];

         if(find_next_volume(buffer, MAX_PATH) == 0)
         {
            m_str.clear();
            ::FindVolumeClose(m_handle.native_handle());
            m_handle = txl::win::handle(0);
         }
         else
         {
            m_str = buffer;
         }

         return *this;
      }

      volume_iterator operator++(int)
      {
         volume_iterator temp;
         temp.m_str    = m_str;
         char_type buffer[MAX_PATH];

         if(find_next_volume(buffer, MAX_PATH) == 0)
         {
            m_str.clear();
            ::FindVolumeClose(m_handle.native_handle());
            m_handle = txl::win::handle(0);
         }
         else
         {
            m_str = buffer;
         }

         return temp;
      }

      bool operator==(const volume_iterator &amp;it) const
      {
         return m_handle == it.m_handle;
      }

      bool operator!=(const volume_iterator &amp;it) const
      {
         return m_handle != it.m_handle;
      }

   private:
      txl::win::handle m_handle;
      std::basic_string&lt;char_type&gt; m_str;

      BOOL find_next_volume(char *buffer, DWORD size)
      {
         return ::FindNextVolumeA(m_handle.native_handle(), buffer, size);
      }

      BOOL find_next_value(wchar_t *buffer, DWORD size)
      {
         return ::FindNextVolumeW(m_handle.native_handle(), buffer, size);
      }
}; /* class volume_iterator */

template&lt;class CHAR&gt;
class volumes
{
   public:
      typedef CHAR char_type;
      typedef volume_iterator&lt;char_type&gt; iterator;

      void operator()(volume_iterator&lt;char_type&gt; &amp;iter) const
      {
         char_type buffer[MAX_PATH];
         iter.m_handle = find_first_volume(buffer, MAX_PATH);
         iter.m_str = buffer;
      }

   private:
      txl::win::handle find_first_volume(char *buffer, DWORD size) const
      {
         return ::FindFirstVolumeA(buffer, size);
      }

      txl::win::handle find_first_volume(wchar_t *buffer, DWORD size) const
      {
         return ::FindFirstVolumeW(buffer, size);
      }
}; /* class volumes */
</code></pre>
<p>wo liegt hier der fehler ?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/312248/compilerfehler-bei-iteratorenvergleich</link><generator>RSS for Node</generator><lastBuildDate>Mon, 03 Aug 2026 01:35:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312248.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 30 Dec 2012 06:39:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to compilerfehler bei iteratorenvergleich on Sun, 30 Dec 2012 06:39:36 GMT]]></title><description><![CDATA[<p>hola leute</p>
<p>folgendes scenario:</p>
<pre><code>volumes&lt;char&gt; vol;
   volumes&lt;char&gt;::iterator iter(vol), end;

   while(iter != end)
   {
      std::cout &lt;&lt; *iter++ &lt;&lt; std::endl;
   }
</code></pre>
<p>hier gibt es kein problem. wenn ich aber folgendes schreibe:</p>
<pre><code>volumes&lt;char&gt;::iterator iter(volumes&lt;char&gt;()), end;

   while(iter != end) // (22)
   {
      std::cout &lt;&lt; *iter++ &lt;&lt; std::endl;
   }
</code></pre>
<p>bekomm ich in zeile (22) folgende fehlermeldung:</p>
<pre><code>1&gt;main.cpp(22): error C2678: Binärer Operator '!=': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'overloaded-function' akzeptiert (oder keine geeignete Konvertierung möglich)
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\exception(522): kann 'bool std::operator !=(const std::exception_ptr &amp;,const std::exception_ptr &amp;)' sein [bei der Verwendung der argumentbezogenen Suche gefunden]
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\exception(527): oder &quot;bool std::operator !=(std::nullptr_t,const std::exception_ptr &amp;)&quot; [bei argumentbezogenem Lookup gefunden]
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\exception(532): oder &quot;bool std::operator !=(const std::exception_ptr &amp;,std::nullptr_t)&quot; [bei argumentbezogenem Lookup gefunden]
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\system_error(443): oder &quot;bool std::operator !=(const std::error_code &amp;,const std::error_condition &amp;) throw()&quot; [bei argumentbezogenem Lookup gefunden]
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\system_error(450): oder &quot;bool std::operator !=(const std::error_condition &amp;,const std::error_code &amp;) throw()&quot; [bei argumentbezogenem Lookup gefunden]
1&gt;          C:\Program Files (x86)\Windows Kits\8.0\Include\shared\guiddef.h(197): oder &quot;bool operator !=(const GUID &amp;,const GUID &amp;)&quot;
1&gt;          bei Anpassung der Argumentliste '(overloaded-function, txl::win::volume_iterator&lt;CHAR&gt;)'
1&gt;          with
1&gt;          [
1&gt;              CHAR=char
1&gt;          ]
1&gt;main.cpp(22): fatal error C1903: Weiterverarbeitung nach vorherigem Fehler nicht möglich; Kompilierung wird abgebrochen.
1&gt;
1&gt;Fehler beim Buildvorgang.
</code></pre>
<p>die volumes-klasse mit dem iterator sieht folgend aus:</p>
<pre><code>template&lt;class CHAR&gt;
class volumes;

template&lt;class CHAR&gt;
class volume_iterator : public std::iterator&lt;std::input_iterator_tag, std::basic_string&lt;CHAR&gt; &gt;
{
   public:
      typedef CHAR char_type;

      template&lt;class&gt; friend class volumes;

      volume_iterator(const volumes&lt;char_type&gt; &amp;v)
      {
         v(*this);
      }

      volume_iterator(void)
      {

      }

      ~volume_iterator(void)
      {
         if(m_handle != txl::win::handle())
            ::FindVolumeClose(m_handle.native_handle());
      }

      std::basic_string&lt;char_type&gt;&amp; operator*(void) 
      {
         return m_str;
      }

      volume_iterator&amp; operator++(void)
      {
         char_type buffer[MAX_PATH];

         if(find_next_volume(buffer, MAX_PATH) == 0)
         {
            m_str.clear();
            ::FindVolumeClose(m_handle.native_handle());
            m_handle = txl::win::handle(0);
         }
         else
         {
            m_str = buffer;
         }

         return *this;
      }

      volume_iterator operator++(int)
      {
         volume_iterator temp;
         temp.m_str    = m_str;
         char_type buffer[MAX_PATH];

         if(find_next_volume(buffer, MAX_PATH) == 0)
         {
            m_str.clear();
            ::FindVolumeClose(m_handle.native_handle());
            m_handle = txl::win::handle(0);
         }
         else
         {
            m_str = buffer;
         }

         return temp;
      }

      bool operator==(const volume_iterator &amp;it) const
      {
         return m_handle == it.m_handle;
      }

      bool operator!=(const volume_iterator &amp;it) const
      {
         return m_handle != it.m_handle;
      }

   private:
      txl::win::handle m_handle;
      std::basic_string&lt;char_type&gt; m_str;

      BOOL find_next_volume(char *buffer, DWORD size)
      {
         return ::FindNextVolumeA(m_handle.native_handle(), buffer, size);
      }

      BOOL find_next_value(wchar_t *buffer, DWORD size)
      {
         return ::FindNextVolumeW(m_handle.native_handle(), buffer, size);
      }
}; /* class volume_iterator */

template&lt;class CHAR&gt;
class volumes
{
   public:
      typedef CHAR char_type;
      typedef volume_iterator&lt;char_type&gt; iterator;

      void operator()(volume_iterator&lt;char_type&gt; &amp;iter) const
      {
         char_type buffer[MAX_PATH];
         iter.m_handle = find_first_volume(buffer, MAX_PATH);
         iter.m_str = buffer;
      }

   private:
      txl::win::handle find_first_volume(char *buffer, DWORD size) const
      {
         return ::FindFirstVolumeA(buffer, size);
      }

      txl::win::handle find_first_volume(wchar_t *buffer, DWORD size) const
      {
         return ::FindFirstVolumeW(buffer, size);
      }
}; /* class volumes */
</code></pre>
<p>wo liegt hier der fehler ?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284381</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sun, 30 Dec 2012 06:39:36 GMT</pubDate></item><item><title><![CDATA[Reply to compilerfehler bei iteratorenvergleich on Sun, 30 Dec 2012 08:35:39 GMT]]></title><description><![CDATA[<p>Edit: Das ist kein Bug! Mir fällt gerade auf, <strong>das was du hast ist eine Funktionsdeklaration!</strong><br />
Guck mal genau hin :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284386</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 30 Dec 2012 08:35:39 GMT</pubDate></item><item><title><![CDATA[Reply to compilerfehler bei iteratorenvergleich on Sun, 30 Dec 2012 08:37:23 GMT]]></title><description><![CDATA[<blockquote>
<pre><code>volumes&lt;char&gt;::iterator iter(volumes&lt;char&gt;())
</code></pre>
</blockquote>
<p>Das deklariert eine lokale Funktion,</p>
<ul>
<li>die einen Funktionszeiger auf eine Funktion nimmt, die keine Parameter nimmt und <code>volumes&lt;char&gt;</code> zurückgibt,</li>
<li>und einen <code>volumes&lt;char&gt;::iterator</code> zurückgibt.</li>
</ul>
<p>Dieses Problem tritt mit direct-initialization in Form von <strong>geschweiften Klammern</strong> nicht auf.<br />
Wenn du also C++11 Unterstützung hast, nimm</p>
<pre><code>volumes&lt;char&gt;::iterator iter{volumes&lt;char&gt;{}}
</code></pre>
<p>Und gewöhn' dir an, ab sofort alle Konstruktoren mit geschweiften Klammern aufzurufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284387</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 30 Dec 2012 08:37:23 GMT</pubDate></item><item><title><![CDATA[Reply to compilerfehler bei iteratorenvergleich on Sun, 30 Dec 2012 09:09:34 GMT]]></title><description><![CDATA[<p>Die Lösung ohne uniform-initialization sind im Übrigen Klammern:</p>
<pre><code>volumes&lt;char&gt;::iterator iter((volumes&lt;char&gt;()));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2284392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284392</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 30 Dec 2012 09:09:34 GMT</pubDate></item><item><title><![CDATA[Reply to compilerfehler bei iteratorenvergleich on Sun, 30 Dec 2012 12:13:04 GMT]]></title><description><![CDATA[<p>hallo leute, danke erstmals fuer die hilfe.</p>
<p>hab hier VC2012 installiert und hab es mal so probiert:</p>
<pre><code>volumes&lt;char&gt;::iterator iter{volumes&lt;char&gt;{}}, end;
</code></pre>
<p>nun bekomm ich</p>
<pre><code>1&gt;main.cpp(20): error C2601: 'iter': Lokale Funktionsdefinitionen sind unzulässig
</code></pre>
<p>heisst das das vc2012 noch keine unterstuetzung fuer C++11 hat ? also was die initialisierungslisten betrifft ?<br />
mir ist auch neu das man eine funktion auch mit geschweiften klammern definieren kann.</p>
<pre><code>volumes&lt;char&gt;::iterator iter((volumes&lt;char&gt;())), end;
</code></pre>
<p>das ist die einzige variante die der compiler schluckt wenn ich ein temporaeres objekt verwenden will. wobei mir die doppelte klammer ueberhaupt nicht gefaellt und ich auch nicht wirklich weiß, warum es nun keine funktionsdeklaration ist.</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284419</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Sun, 30 Dec 2012 12:13:04 GMT</pubDate></item><item><title><![CDATA[Reply to compilerfehler bei iteratorenvergleich on Sun, 30 Dec 2012 12:51:31 GMT]]></title><description><![CDATA[<blockquote>
<p>ich auch nicht wirklich weiß, warum es nun keine funktionsdeklaration ist.</p>
</blockquote>
<p>Nun kann der Compiler nicht mehr annehmen, dass es eine Funktionsdeklaration ist, weil innen keine Parameterliste mehr steht sondern ein <strong>Ausdruck</strong>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284430</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 30 Dec 2012 12:51:31 GMT</pubDate></item><item><title><![CDATA[Reply to compilerfehler bei iteratorenvergleich on Sun, 30 Dec 2012 12:53:11 GMT]]></title><description><![CDATA[<p>Meep Meep schrieb:</p>
<blockquote>
<p>hallo leute, danke erstmals fuer die hilfe.</p>
<p>hab hier VC2012 installiert und hab es mal so probiert:</p>
<pre><code>volumes&lt;char&gt;::iterator iter{volumes&lt;char&gt;{}}, end;
</code></pre>
<p>nun bekomm ich</p>
<pre><code>1&gt;main.cpp(20): error C2601: 'iter': Lokale Funktionsdefinitionen sind unzulässig
</code></pre>
<p>heisst das das vc2012 noch keine unterstuetzung fuer C++11 hat ? also was die initialisierungslisten betrifft ?<br />
mir ist auch neu das man eine funktion auch mit geschweiften klammern definieren kann.</p>
</blockquote>
<p>*Facepalm*<br />
Nein, das soll ja gerade verhindern dass es als Funktionsdeklaration interpretiert wird!</p>
<p>Und die Fehlermeldung besagt ganz klar, dass VC++-2012 noch nicht genügend C++11-Unterstützung hat, weil das gültiges C++11 ist; Du musst wohl leider vorerst cooky's Variante nutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284431</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 30 Dec 2012 12:53:11 GMT</pubDate></item><item><title><![CDATA[Reply to compilerfehler bei iteratorenvergleich on Sun, 30 Dec 2012 23:04:32 GMT]]></title><description><![CDATA[<p>Stichwort: Most Vexing Parse. Die wohl duemmste Erfindung, die ich je in einer Programmiersprache gesehen habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2284634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2284634</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Sun, 30 Dec 2012 23:04:32 GMT</pubDate></item></channel></rss>