std::vector::iterator muckt...



  • Hi,
    folgeder code:

    std::vector<AItask> v;
    ...
    for (std::vector<AItask>::iterator i = reservations.begin(); i
        != reservations.end(); i++)
    

    folgende fehlerlendung:

    **** Build of configuration rel for project pXai ****

    mingw32-make all
    'Building file: ../src/AIcalendar.cpp'
    'Invoking: GCC C++ Compiler'
    g++ -O2 -g -Wall -c -fmessage-length=0 -MMD -MP -MF"src/AIcalendar.d" -MT"src/AIcalendar.d" -o"src/AIcalendar.o" "../src/AIcalendar.cpp"
    C:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/stl_iterator.h: In constructor \_\_gnu\_cxx::\_\_normal\_iterator<\_Iterator, \_Container>::\_\_normal\_iterator(const \_\_gnu\_cxx::\_\_normal\_iterator<\_Iter, \_Container>&) [with \_Iter = const AItask*, \_Iterator = AItask*, \_Container = std::vector<AItask, std::allocator<AItask> >]': ../src/AIcalendar.cpp:116: instantiated from here C:/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/stl_iterator.h:609: error: invalid conversion from \const AItask* const' to `AItask*'
    mingw32-make: *** [src/AIcalendar.o] Error 1

    das sieht schon ma sehr aufgeräumt aus... zu info: AIcalendar.cpp ist das oben gezeigte file. besagte zeile 116 ist dort, wo der for-loop anfängt.

    es hängt definitiv zusammen mit der deklaration

    std::vector<AItask>::iterator i;
    

    nur, was geht daran denn nit?!


  • Mod

    was ist mit reservations? zufällig ein std::vector<AItask> const& ?



  • wie meinst du das?
    Naja, wie der Vector deklariert ist, steht ja oben, nix const oä. und auch schon die deklaration std::vector<AItask>::iterator i; macht das problem...



  • piXelshooter schrieb:

    Naja, wie der Vector deklariert ist, steht ja oben, nix const oä.

    Da steht nur, was v ist. Camper hatte nach reservations gefragt. Es deutet nämlich alles darauf hin, dass dieser vector const ist.



  • sry.
    was meint ihr mit reservations?



  • piXelshooter schrieb:

    sry.
    was meint ihr mit reservations?

    Den vector, dessen begin- und end-Methode du da aufrufst. Der Bezeichner stammt aus deinem Code.



  • piXelshooter schrieb:

    sry.
    was meint ihr mit reservations?

    piXelshooter schrieb:

    ... = reservations....
    

    Gruß,

    Simon2.



  • omg sry... dachte das hätte iwas mit dem speichermanagement im vektor zu tun, völlig verpeilt, dass mein vektor ja reservations HEIßT -__-°

    std::vector<AItask> reservations;
    ...
    for (std::vector<AItask>::iterator i = reservations.begin(); i
        != reservations.end(); i++)
    

    das sind die relevanten codestücke.
    aber auch wenn ich nur:

    std::vector<AItask>::iterator i;
    

    schreibe, erhalte ich besagte fehlermeldung.


  • Mod

    wie sieht die Definition von AItask aus?



  • class AItask
    {
        public:
            AItask();
            ~AItask();
            bool operator <(AItask& cmp);
            AItimeInterval interval; // TODO private
        private:
            unsigned char priority;
            AIabstractAction* toDo;
    };
    

    Welche Eigenschaft könnte den verantwortlich dafür sein?



  • Hi,

    ich weiß nicht, ob's daran liegt, aber irgendwie würde ich den operator<() "doppelt const" ( operator<( .... const&) const; ) deklarieren...
    Ansonsten gilt halt: Das Teil muss kopierbar sein - und damit auch alle seine Elemente (z.B. AItimeInterval).
    Worauf zeigt eigentlich AIabstractAction* toDo ... nachdem ein Objekt kopiert wurde ? Auf ein "externes Objekt" - dann wäre das in Ordnung. Wenn es aber "irgendwie" auf "irgendetwas" innerhalb des AItask-Objekts zeigt, braucht's einen entsprechend intelligenten CopyConstr/operator=().
    Gilt auch anders herum: Wenn irgendein Objekt "außerhalb der AItask" auf ein AItask-Objekt zeigt, verliert dieser Verweis seine Gültigkeit, sobald dieses Objekt verschoben wird.... und das tut std::vector halt bisweilen.

    Gruß,

    Simon2.


Anmelden zum Antworten