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 1vielen 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
- als freie Funktione (du hast beide als Memberfunktionen implementiert)
- 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
-
Ich hab die nächste Frage mal in einen eigenen Thread abgetrennt:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-264555-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html
-
vielen dank für die hilfe.