was bedeutet fehler?



  • hallo zusammen,

    kann mir jemand sagen, was mir die fehlermeldung sagen will?
    er tritt auf in diesem abschnitt:

    MessageIdentTimePair::MessageIdent mid = std::make_pair(getIndex(), sequ);
    --> LTList::iterator it = std::find(ltList.begin(), ltList.end(), MessageIdentTimePairFunctor(mid));
    

    g++ -c -g -Wall -fno-stack-protector -fPIC -DXMLPARSER=libxml -DWITH_PARSIM -DWITH_NETBUILDER -I. -I/opt/omnetpp-4.0p1/include -o ../out/gcc-debug//src/Peer.o Peer.cc
    /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘_RandomAccessIterator std::__find(_RandomAccessIterator, _RandomAccessIterator, const _Tp&, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<MessageIdentTimePair*, std::vector<MessageIdentTimePair, std::allocator<MessageIdentTimePair> > >, _Tp = MessageIdentTimePairFunctor]’:
    /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:316: instantiated from ‘_InputIterator std::find(_InputIterator, _InputIterator, const _Tp&) [with _InputIterator = __gnu_cxx::__normal_iterator<MessageIdentTimePair*, std::vector<MessageIdentTimePair, std::allocator<MessageIdentTimePair> > >, _Tp = MessageIdentTimePairFunctor]’
    Peer.cc:165: instantiated from here
    /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:208: error: no match for ‘operator==’ in ‘__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = MessageIdentTimePair*, _Container = std::vector<MessageIdentTimePair, std::allocator<MessageIdentTimePair> >]() == __val’
    MessageIdentTimePair.h:57: note: candidates are: bool MessageIdentTimePair::operator==(MessageIdentTimePair) const
    /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:212: error: no match for ‘operator==’ in ‘__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = MessageIdentTimePair*, _Container = std::vector<MessageIdentTimePair, std::allocator<MessageIdentTimePair> >]() == __val’
    MessageIdentTimePair.h:57: note: candidates are: bool MessageIdentTimePair::operator==(MessageIdentTimePair) const
    /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:216: error: no match for ‘operator==’ in ‘__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = MessageIdentTimePair*, _Container = std::vector<MessageIdentTimePair, std::allocator<MessageIdentTimePair> >]() == __val’
    MessageIdentTimePair.h:57: note: candidates are: bool MessageIdentTimePair::operator==(MessageIdentTimePair) const
    /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:220: error: no match for ‘operator==’ in ‘__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = MessageIdentTimePair*, _Container = std::vector<MessageIdentTimePair, std::allocator<MessageIdentTimePair> >]() == __val’
    MessageIdentTimePair.h:57: note: candidates are: bool MessageIdentTimePair::operator==(MessageIdentTimePair) const
    /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:228: error: no match for ‘operator==’ in ‘__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = MessageIdentTimePair*, _Container = std::vector<MessageIdentTimePair, std::allocator<MessageIdentTimePair> >]() == __val’
    MessageIdentTimePair.h:57: note: candidates are: bool MessageIdentTimePair::operator==(MessageIdentTimePair) const
    /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:232: error: no match for ‘operator==’ in ‘__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = MessageIdentTimePair*, _Container = std::vector<MessageIdentTimePair, std::allocator<MessageIdentTimePair> >]() == __val’
    MessageIdentTimePair.h:57: note: candidates are: bool MessageIdentTimePair::operator==(MessageIdentTimePair) const
    /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:236: error: no match for ‘operator==’ in ‘__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = MessageIdentTimePair*, _Container = std::vector<MessageIdentTimePair, std::allocator<MessageIdentTimePair> >]() == __val’
    MessageIdentTimePair.h:57: note: candidates are: bool MessageIdentTimePair::operator==(MessageIdentTimePair) const
    gmake[3]: *** [../out/gcc-debug//src/Peer.o] Error 1

    vielen dank!



  • Er findet den zu werwendenden operator== nicht.

    Welcher das genau sein müsste kann man dir so genau nicht sagen, da uns die Definition von MessageIdentTimePair, MessageIdentTimePairFunctor und LTList fehlt.



  • Mir scheint irgendwie, dass deine Implementierung einen random access Iterator verlangt.. 😕
    Funktioniert das hier:

    #include <algorithm>
    #include <list>
    
    int main() 
    {
     std::list<int> l;
     std::list<int>::iterator it = std::find ( l.begin (), l.end (), 2 );
    }
    


  • Es gibt ja offenbar einen Kandidaten für den Operator. War da nicht irgendwas, dass die Algorithmen der Standardbibliothek keine Operatoren verwenden können, die außerhalb des Namespace std stehen?



  • he pumuckel,

    das kann ich doch nachliefern, da alles von mir ist ;).

    class MessageIdentTimePair {
    public:
    
        typedef std::pair<int, int> MessageIdent;
    
        MessageIdentTimePair() {
            messageID = std::make_pair(-1, -1);
            lt = -1;
        }//End Triple
    
        MessageIdentTimePair(int nodeID, int sequ, int aLt) {
            messageID = std::make_pair(nodeID, sequ);
            lt = aLt;
        }//End MessageIdentTimePair
    
        MessageIdentTimePair(MessageIdent aMessageID, int aLt) {
            messageID = aMessageID;
            lt = aLt;
        }//End Triple
    
        MessageIdentTimePair(const MessageIdentTimePair& orig) {
            messageID = orig.messageID;
            lt = orig.lt;
        }//End Triple
    
        virtual ~MessageIdentTimePair() {
        }//End ~Triple
    
        void setMessageID(MessageIdent aMessageID) {
            this->messageID = aMessageID;
        }//End setMessageID
    
        MessageIdent getMessageID() {
            return messageID;
        }//End getMessageID
    
        void setLT(int aLt) {
            lt = aLt;
        }//End setLT
    
        int getLT() {
            return lt;
        }//End getLT
    
        bool operator==(const MessageIdentTimePair aMitp) const {
            return (messageID == aMitp.messageID) && (lt == aMitp.lt);
        }
    
        bool operator !=(MessageIdentTimePair aMitp) const {
            return (messageID != aMitp.messageID) || (lt != aMitp.lt);
        }
    
    private:
        MessageIdent messageID;
        int lt;
    
    };
    
    class MessageIdentTimePairFunctor {
    public:
    
        MessageIdentTimePairFunctor(MessageIdentTimePair::MessageIdent aMid) {
            mid = aMid;
        }
    
        bool operator()(MessageIdentTimePair aMitp) {
            MessageIdentTimePair::MessageIdent amid = aMitp.getMessageID();
            return true;
            //                mid.first == amid.first && mid.second == amid.second;
        }//End operator
    
    private:
        MessageIdentTimePair::MessageIdent mid;
    };
    

    und die LTList ist nur ein typedef:

    typedef std::vector<MessageIdentTimePair> LTList;
        LTList ltList;
    

    Was ist an meinem operator== falsch?

    Vielen Dank! uwe



  • strange... allerdings sind mir die Vergleichsoperatoren etwas suspekt. Sowas implementiert man üblicherweise

    1. als freie Funktione (du hast beide als Memberfunktionen implementiert)
    2. mit constanten Referenzen als Argumenten (du hast einmal eine const Kopie und eine non-const Kopie benutzt)

    außerdem solltest du auch beim op() im Functor das Argument zu einer const Referenz machen.



  • std::find_if statt std::find bei einem predicate verwenden 😉





  • vielen dank für die hilfe.


Log in to reply