[Solved] Making container 'foreach'able: Conversion loses qualifiers

  • I have a custom container that I want to make iterable. Specifically, the following code should compile:

    // Note: We are inside a non-const method
    CTpeb_ElementMap selectedSiblings = getSelectedSiblingElements();

    Q_FOREACH(CTpeb_AbstractElement* pElement, selectedSiblings)
    // ...

    Withing my ElementMap class, I have the iterator class defined (I'm leaving out const_iterator for the moment):
    @ class iterator
    typedef std::forward_iterator_tag iterator_category;

        iterator(const iterator& other);
        iterator& operator=(const iterator& other);
        CTpeb_AbstractElement*& operator*() const;
        bool operator==(const iterator& other) const;
        bool operator!=(const iterator& other) const;
        iterator& operator++();
        // ...

    In CTpeb_ElementMap, I have the begin() and end() methods:

    CTpeb_ElementMap::iterator begin();
    CTpeb_ElementMap::iterator end();

    The error message is:
    bq. cannot convert from 'const CTpeb_AbstractElement *' to 'CTpeb_AbstractElement *' - Conversion loses qualifiers

    Currently, I have removed all the interfaces allowing access to a const_iterator. Why does Q_FOREACH still manage to access a 'const CTpeb_AbstractElement*' ? Any ideas?

    When I expand Q_FOREACH into a looper over the iterator, it compiles:
    @ for(CTpeb_ElementMap::iterator iter = selectedSiblings.begin(); iter != selectedSiblings.end(); ++iter)
    CTpeb_AbstractElement* pElement = *iter;
    // ...

    What's the difference between my loop and a standard Q_FOREACH loop?

    EDIT2: Solution:
    I realized that Q_FOREACH always uses the const_iterator. In my case, the const_iterator must return a byvalue copy of the pointer - the pointer itself can thus not be changed (which satisfies the const_iterator's const correctness), but the object behind the pointer can be changed (which is what I intended within my foreach loop).

Log in to reply

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.