Iterator fehler
-
Hallo zusammen,
mit Eurer Hilfe habe ich ja vor kurzem meinen eigenen Container mit einen Iterator ergänzt. Das tut auch alles wunderbar. Nun will ich daher ein wenig aufräumen und andere Container auf diesen zurückführen. Dazu fehlen mir aber ein paar operatoren und Methoden. Nun bin ich am basteln und bekomme einen Fehler, wo ich gar nicht weiß, was die mir sagen will. Daher die Frage an Euch: was ist da den falsch?
Zum Kontext: Mein Container ist List<T> und ich will PairQueue als Wrapper drum herum bauen. DetectionTimer ist nen Timer, der in der PairQueue unter einer PeerID als Schlüssel gespeichert wird.
In der Methode:
template <typename S, typename T> T PairQueue<S, T>::find(const S & key) const { typename STPairList::iterator it; it = std::find_if(queue.begin(), queue.end(), STPairListFunctor(key)); if (it == queue.end()) { return NULL; } return (it->second); }
Kommt es in der Zeile it = std::find_if(queue.begin() zu folgenen Fehler:
PairQueue.h:175: error: no match for ‘operator=’ in ‘it = std::find_if [with _IIter = List<std::pair<PeerID, DetectionTimer*> >::Iterator<const std::pair<PeerID, DetectionTimer*> >, _Predicate = PairQueue<PeerID, DetectionTimer*>::STPairListFunctor](((const PairQueue<PeerID, DetectionTimer*>*)this)->PairQueue<PeerID, DetectionTimer*>::queue::List<T>::begin [with T = std::pair<PeerID, DetectionTimer*>](), ((const PairQueue<PeerID, DetectionTimer*>*)this)->PairQueue<PeerID, DetectionTimer*>::queue::List<T>::end [with T = std::pair<PeerID, DetectionTimer*>](), PairQueue<PeerID, DetectionTimer*>::STPairListFunctor(((const PeerID&)((const PeerID*)key))))’
Die Variable queue ist vom Typ List<Pair>, welche von der PairQueue genutzt wird, wobei ein Pair halt nen Standard_pair von PeerID und DetectionTimer* ist.
Jemand nen Tip???
Danke schon einmal.
-
ups, da war der umbruch weg, daher nochmal in häßlich:
`
h:175: error: no match for ‘operator=’ in ‘it = std::find_if [with _IIter =
List<std::pair<PeerID, DetectionTimer*> >::Iterator<const std::pair<PeerID,
DetectionTimer*> >, _Predicate = PairQueue<PeerID,
DetectionTimer*>::STPairListFunctor](((const PairQueue<PeerID,
DetectionTimer*>*)this)->PairQueue<PeerID,
DetectionTimer*>::queue::List<T>::begin [with T = std::pair<PeerID,
DetectionTimer*>](), ((const PairQueue<PeerID, DetectionTimer*>*)this)-
PairQueue<PeerID, DetectionTimer*>::queue::List<T>::end [with T =
std::pair<PeerID, DetectionTimer*>](), PairQueue<PeerID,
DetectionTimer*>::STPairListFunctor(((const PeerID&)((const PeerID*)key))))’
`
-
und noch eins,
den operator= habe ich so:
template <typename L> class Iterator : public std::iterator<std::forward_iterator_tag, L> { L * pos; friend class List<T>; explicit Iterator(L * aPos); public: ... Iterator<L> operator=(const Iterator<L> & other); ... };
Ich vermute das reicht wohl nicht. liegt es am forward_iterator????
-
Warum ist der Iterator ein Template?
Poste den ganzen Code auf Codepad.org o.ä. und verlinke es bitte. So ist es extrem anstrengend weitere Aussagen zu treffen.
-
Wenn man die Fehlermeldung ordentlich formatiert, fällt es direkt auf
no match for ‘operator=’ in ‘it = std::find_if [with _IIter = List<std::pair<PeerID, DetectionTimer*> >::Iterator<const std::pair<PeerID, DetectionTimer*> >, _Predicate = PairQueue<PeerID, DetectionTimer*>::STPairListFunctor] (((const PairQueue<PeerID, DetectionTimer*>*)this)->PairQueue<PeerID, DetectionTimer*>::queue::List<T>::begin [with T = std::pair<PeerID, DetectionTimer*>](), ((const PairQueue<PeerID, DetectionTimer*>*)this)->PairQueue<PeerID, DetectionTimer*>::queue::List<T>::end [with T = std::pair<PeerID, DetectionTimer*>](), PairQueue<PeerID, DetectionTimer*>::STPairListFunctor(((const PeerID&)((const PeerID*)key))))’
STPairList::iterator
ist folglich nicht dasselbe wieList<std::pair<PeerID, DetectionTimer*> >::Iterator<const std::pair<PeerID, DetectionTimer*>
.
Angenommen,STPairList
ist ein Typedef fürList<std::pair<PeerID, DetectionTimer*> >
-
Dann istiterator
ein Typedef inSTPairList
, und dieses Typedef verweist nicht auf die SpezialisierungIterator<const std::pair<PeerID, DetectionTimer*>>
.Meine Theorie ist folgende:**
queue
istconst
**, daher ist der Rückgabewert vonbegin()
/end()
eine Spezialisierung desIterator
-Templates mit Zeiger aufconst
.
Also:
Typ vonit
istIterator<std::pair<PeerID, DetectionTimer*>>
Typ vonqueue.begin()
istIterator<const std::pair<PeerID, DetectionTimer*>>
Edit: Schließende Klammer vergessen... doofe Template-Fehlermeldungen..
-
Schnellschuß:
std::find_if
will demSTPairListFunctor()
einstd::pair<S, T>
geben, es nimmt aber nurS
.
-
hallo zusammen,
hier also der gewünschte code in lang.
Zunächst die List.h:
http://codepad.org/c0ZmouJGund die PairQueue.h:
http://codepad.org/qur0oCaRDer Itertator ist nen Template, weil List nen Template ist.
Wenn ich den STPairListFunctor (was für nen mistding, aber lamda ausdrücke gehen hier leider noch nicht ) um einen Konstruktor:
STPairListFunctor(const STPair & pair) { orig = pair.first; }
Ändert dies leider nix. Er bleibt bei:
PairQueue.h:179: error: no match for ‘operator=’ in ‘it = std::find_if [with _IIter = List<std::pair<PeerID, DetectionTimer*> >::Iterator<const std::pair<PeerID, DetectionTimer*> >, _Predicate = PairQueue<PeerID, DetectionTimer*>::STPairListFunctor] ( ((const PairQueue<PeerID, DetectionTimer*>*)this)->PairQueue<PeerID, DetectionTimer*>::queue.List<T>::begin [with T = std::pair<PeerID, DetectionTimer*>] (), ((const PairQueue<PeerID, DetectionTimer*>*)this)->PairQueue<PeerID, DetectionTimer*>::queue.List<T>::end [with T = std::pair<PeerID, DetectionTimer*>] (), PairQueue<PeerID, DetectionTimer*>::STPairListFunctor(((const PeerID&)((const PeerID*)key))) )’
Das const PairQueue sehe ich, verstehs aber nicht, auch gerade nicht mit den Erklärungen von Arcoth.
Aber ein riesen Dank für Eure mühe Jungs!
der sven_
-
achso, weil find const ist. wenn ich das const von der mehtode entferne, komme ich weiter. aber wie muß ich es ändern, damit ich das const lassen kann????
-
irgendwie dreh ich mich im kreis:
no match for ‘operator=’ in ‘it = std::find_if(_IIter, _IIter, _Predicate) [with _IIter = List<std::pair<PeerID, DetectionTimer*> >::Iterator<std::pair<PeerID, DetectionTimer*> >, _Predicate = PairQueue<PeerID, DetectionTimer*>::STPairListFunctor](List<T>::end() [with T = std::pair<PeerID, DetectionTimer*>](), PairQueue<PeerID, DetectionTimer*>::STPairListFunctor(((const PeerID&)((const PeerID*)key))))’ candidates are: List<T>::Iterator<L> List<T>::Iterator<L>::operator=(List<T>::Iterator<L>&) [with L = std::pair<PeerID, DetectionTimer*>, T = std::pair<PeerID, DetectionTimer*>]
wie muß die signatur von operator= sein?? jemand nen tip?
-
Du benötigst einen const_iterator:
typename STPairList::const_iterator it;
-
ah! da wäre ich ja nie drauf gekommen. vielen dank!