Mein Iterator lässt sich nicht kompilieren. Warum?



  • Warum funktioniert das nicht?

    #include <algorithm>
    #include <iostream>
    using namespace std;
    
    struct my_iter {
          int i;
          static const int end = 10;
          my_iter(int start = end) : i(start) {}
          my_iter& operator ++ () {
                if (i < end) ++i;
                return *this;
          }
          my_iter& operator * () { return *this; }
          bool operator != (const my_iter& m) { return i != m.i; }
          operator int () { return i; }
    };
    
    int main()
    {
          copy(my_iter(0), my_iter(), ostream_iterator<int>(cout, " "));
    }
    

    Ich kriege:

    1>------ Build started: Project: iterator_test, Configuration: Debug Win32 ------
    1>Compiling...
    1>main.cpp
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(764) : error C2039: 'iterator_category' : is not a member of 'my_iter'
    1> c:\users\zdravko\documents\visual studio 2008\projects\console\iterator_test\main.cpp(6) : see declaration of 'my_iter'
    1> c:\program files\microsoft visual studio 9.0\vc\include\xutility(2537) : see reference to class template instantiation 'std::iterator_traits<_Iter>' being compiled
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1> c:\users\zdravko\documents\visual studio 2008\projects\console\iterator_test\main.cpp(21) : see reference to function template instantiation 'std::ostream_iterator<_Ty> std::copy<my_iter,std::ostream_iterator<_Ty>>(_InIt,_InIt,_OutIt)' being compiled
    1> with
    1> [
    1> _Ty=int,
    1> _InIt=my_iter,
    1> _OutIt=std::ostream_iterator<int>
    1> ]
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(764) : error C2146: syntax error : missing ';' before identifier 'iterator_category'
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(764) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(764) : error C2602: 'std::iterator_traits<_Iter>::iterator_category' is not a member of a base class of 'std::iterator_traits<_Iter>'
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1> c:\program files\microsoft visual studio 9.0\vc\include\xutility(764) : see declaration of 'std::iterator_traits<_Iter>::iterator_category'
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(764) : error C2868: 'std::iterator_traits<_Iter>::iterator_category' : illegal syntax for using-declaration; expected qualified-name
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(765) : error C2039: 'value_type' : is not a member of 'my_iter'
    1> c:\users\zdravko\documents\visual studio 2008\projects\console\iterator_test\main.cpp(6) : see declaration of 'my_iter'
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(765) : error C2146: syntax error : missing ';' before identifier 'value_type'
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(765) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(765) : error C2602: 'std::iterator_traits<_Iter>::value_type' is not a member of a base class of 'std::iterator_traits<_Iter>'
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1> c:\program files\microsoft visual studio 9.0\vc\include\xutility(765) : see declaration of 'std::iterator_traits<_Iter>::value_type'
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(765) : error C2868: 'std::iterator_traits<_Iter>::value_type' : illegal syntax for using-declaration; expected qualified-name
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(766) : error C2039: 'difference_type' : is not a member of 'my_iter'
    1> c:\users\zdravko\documents\visual studio 2008\projects\console\iterator_test\main.cpp(6) : see declaration of 'my_iter'
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(766) : error C2146: syntax error : missing ';' before identifier 'difference_type'
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(766) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(766) : error C2602: 'std::iterator_traits<_Iter>::difference_type' is not a member of a base class of 'std::iterator_traits<_Iter>'
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1> c:\program files\microsoft visual studio 9.0\vc\include\xutility(766) : see declaration of 'std::iterator_traits<_Iter>::difference_type'
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(766) : error C2868: 'std::iterator_traits<_Iter>::difference_type' : illegal syntax for using-declaration; expected qualified-name
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(768) : error C2039: 'pointer' : is not a member of 'my_iter'
    1> c:\users\zdravko\documents\visual studio 2008\projects\console\iterator_test\main.cpp(6) : see declaration of 'my_iter'
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(768) : error C2146: syntax error : missing ';' before identifier 'pointer'
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(768) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(768) : error C2602: 'std::iterator_traits<_Iter>::pointer' is not a member of a base class of 'std::iterator_traits<_Iter>'
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1> c:\program files\microsoft visual studio 9.0\vc\include\xutility(768) : see declaration of 'std::iterator_traits<_Iter>::pointer'
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(768) : error C2868: 'std::iterator_traits<_Iter>::pointer' : illegal syntax for using-declaration; expected qualified-name
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(769) : error C2039: 'reference' : is not a member of 'my_iter'
    1> c:\users\zdravko\documents\visual studio 2008\projects\console\iterator_test\main.cpp(6) : see declaration of 'my_iter'
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(769) : error C2146: syntax error : missing ';' before identifier 'reference'
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(769) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(769) : error C2602: 'std::iterator_traits<_Iter>::reference' is not a member of a base class of 'std::iterator_traits<_Iter>'
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1> c:\program files\microsoft visual studio 9.0\vc\include\xutility(769) : see declaration of 'std::iterator_traits<_Iter>::reference'
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1>c:\program files\microsoft visual studio 9.0\vc\include\xutility(769) : error C2868: 'std::iterator_traits<_Iter>::reference' : illegal syntax for using-declaration; expected qualified-name
    1> with
    1> [
    1> _Iter=my_iter
    1> ]
    1>Build log was saved at "file://c:\Users\Zdravko\Documents\Visual Studio 2008\Projects\console\iterator_test\Debug\BuildLog.htm"
    1>iterator_test - 25 error(s), 0 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========



  • Also, das hat mich gerettet:

    struct my_iter : public iterator<forward_iterator_tag, my_iter>
    

    Nun, frage ich mich, ob es möglich ist diese idiotische Iterator-Checks einzustellen.



  • von was für checks sprichst du?



  • lolz_ausgeloggt schrieb:

    von was für checks sprichst du?

    Die Eingabeparameter werden nach irgendeinem Kriterium geprüft.



  • Die Algorithmen brauchen einfach ein paar Infos über das was in dem Iterator drinsteckt. Das musst Du entweder selbst liefern oder per Ableitung von std::iterator verfügbar machen. Mit Checks hat das nichts zu tun.

    EDIT:

    Zdravko schrieb:

    lolz_ausgeloggt schrieb:

    von was für checks sprichst du?

    Die Eingabeparameter werden nach irgendeinem Kriterium geprüft.

    Ja, z.B. daraufhin ob man effizient springen (random-access) oder nur vorwärts laufen (forward) kann, um bestimmte Optimierungen zu ermöglichen...



  • LordJaxom schrieb:

    Die Algorithmen brauchen einfach ein paar Infos über das was in dem Iterator drinsteckt. Das musst Du entweder selbst liefern oder per Ableitung von std::iterator verfügbar machen. Mit Checks hat das nichts zu tun.

    EDIT:

    Zdravko schrieb:

    lolz_ausgeloggt schrieb:

    von was für checks sprichst du?

    Die Eingabeparameter werden nach irgendeinem Kriterium geprüft.

    Ja, z.B. daraufhin ob man effizient springen (random-access) oder nur vorwärts laufen (forward) kann, um bestimmte Optimierungen zu ermöglichen...

    Hmm, das ist neu für mich. Kannst du Beispiele nennen wo man die Infos selbst liefert? Oder per Ableitung macht?



  • Naja in Deinem Fall hast Du z.B. über die Ableitung erreicht, dass my_iter::iterator_category existiert und vom Typ forward_iterator_tag ist. Wenn jetzt ein Algorithmus wie distance eingesetzt wird, kommt eine Version zum Einsatz, die durch inkrementieren herausfindet wieviele Elemente zwischen zwei Iteratoren existieren. Wäre die Kategorie nun random_access_iterator_tag, würde eine Version von distance eingesetzt, die die Anzahl durch Subtraktion herausfindet.

    Würdest Du nicht ableiten, müsstest Du in der Klasse ein typedef std::forward_iterator_tag iterator_category machen.



  • LordJaxom schrieb:

    Würdest Du nicht ableiten, müsstest Du in der Klasse ein typedef std::forward_iterator_tag iterator_category machen.

    Das finde ich schon gut. Danke für die Erklärung! Die C++ Sprache ist so breit. Man lernt ständig neue Sachen.


Anmelden zum Antworten