std::map fimd() problem
-
Hallo,
class Element { public: Element(const std::string& identifier, unsigned ordinal_number, double atomic_weight); // ... }; static std::map<std::string, Element> elements = { { "C", { "C", 6, 12.0 } }, { "O", { "O", 8, 16.0 } }, // ... }; class Molecular { public: std::map<Element, int>& getElements(); friend std::istream& operator>>(std::istream&, Molecular&); // ... private: std::map<Element, int> elements; }; std::istream& operator>>(std::istream& in, Molecular& molecular) { molecular.getElements().clear(); for (/* identifier wird hier definiert */) { auto elements = molecular.getElements(); auto it = elements.find(::elements[identifier]); // ... } return in; }Der Compiler schreit in der Zeile wo elements.find() aufgerufen wird.
1>d:\visual studio\vc\include\xstddef(193): error C2784: "bool std::operator <(const std::tuple<_Types...> &,const std::tuple<_Types1...> &)": template-Argument für "const std::tuple<_Types...> &" konnte nicht von "const Element" hergeleitet werden. 1> d:\visual studio\vc\include\tuple(480): Siehe Deklaration von 'std::operator <' 1> d:\visual studio\vc\include\xstddef(192): Bei der Kompilierung der Klassen-template der bool std::less<_Kty>::operator ()(const _Ty &,const _Ty &) const-Memberfunktion 1> with 1> [ 1> _Kty=Element 1> , _Ty=Element 1> ] 1> d:\visual studio\vc\include\xutility(521): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "bool std::less<_Kty>::operator ()(const _Ty &,const _Ty &) const". 1> with 1> [ 1> _Kty=Element 1> , _Ty=Element 1> ] 1> d:\visual studio\vc\include\type_traits(572): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::less<_Kty>". 1> with 1> [ 1> _Kty=Element 1> ] 1> d:\visual studio\vc\include\xtree(1023): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::is_empty<std::less<_Kty>>". 1> with 1> [ 1> _Kty=Element 1> ] 1> d:\visual studio\vc\include\map(70): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>". 1> with 1> [ 1> _Kty=Element 1> , _Ty=int 1> , _Pr=std::less<Element> 1> , _Alloc=std::allocator<std::pair<const Element,int>> 1> ] 1> c:\users\z003akjs\desktop\vs projects\jonas_projekt\jonas_projekt\molecular.h(15): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::map<Element,int,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>". 1> with 1> [ 1> _Kty=Element 1> , _Ty=int 1> ] 1>d:\visual studio\vc\include\xstddef(193): error C2784: "bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)": template-Argument für "const std::_Tree<_Traits> &" konnte nicht von "const Element" hergeleitet werden. 1> d:\visual studio\vc\include\xtree(2259): Siehe Deklaration von 'std::operator <' 1>d:\visual studio\vc\include\xstddef(193): error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "const Element" hergeleitet werden. 1> d:\visual studio\vc\include\xstring(2545): Siehe Deklaration von 'std::operator <' 1>d:\visual studio\vc\include\xstddef(193): error C2784: "bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const _Elem *" konnte nicht von "const Element" hergeleitet werden. 1> d:\visual studio\vc\include\xstring(2535): Siehe Deklaration von 'std::operator <' 1>d:\visual studio\vc\include\xstddef(193): error C2784: "bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)": template-Argument für "const std::basic_string<_Elem,_Traits,_Alloc> &" konnte nicht von "const Element" hergeleitet werden. 1> d:\visual studio\vc\include\xstring(2525): Siehe Deklaration von 'std::operator <' 1>d:\visual studio\vc\include\xstddef(193): error C2784: "bool std::operator <(const std::move_iterator<_RanIt> &,const std::move_iterator<_RanIt2> &)": template-Argument für "const std::move_iterator<_RanIt> &" konnte nicht von "const Element" hergeleitet werden. 1> d:\visual studio\vc\include\xutility(1997): Siehe Deklaration von 'std::operator <' 1>d:\visual studio\vc\include\xstddef(193): error C2784: "bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "const Element" hergeleitet werden. 1> d:\visual studio\vc\include\xutility(1155): Siehe Deklaration von 'std::operator <' 1>d:\visual studio\vc\include\xstddef(193): error C2784: "bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)": template-Argument für "const std::_Revranit<_RanIt,_Base> &" konnte nicht von "const Element" hergeleitet werden. 1> d:\visual studio\vc\include\xutility(971): Siehe Deklaration von 'std::operator <' 1>d:\visual studio\vc\include\xstddef(193): error C2784: "bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)": template-Argument für "const std::pair<_Ty1,_Ty2> &" konnte nicht von "const Element" hergeleitet werden. 1> d:\visual studio\vc\include\utility(230): Siehe Deklaration von 'std::operator <' 1>d:\visual studio\vc\include\xstddef(193): error C2676: Binärer Operator '<': 'const Element' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht ========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========Ich hab gerade keine Ahnung was da schief läuft, kann mir jemand auf die Sprünge helfen?
-
Kein operator< definiert?
-
Ja. Kann ich das vermeiden in dem ich eine unordered_map verwende?
-
Dann brauchst du eine hash-Funktion.
-
Was es auch nicht unbedingt besser macht. Ich könnte jetzt den operator< definieren mit einem wahllosen Verhalten und es würde funktionieren (einfach irgendwie true oder false zurückgeben). Gibts da nicht irgendwas elegantes?
Gruß
-
maphelpneeded schrieb:
Ich könnte jetzt den operator< definieren mit einem wahllosen Verhalten und es würde funktionieren (einfach irgendwie true oder false zurückgeben).
Es würde kompilieren, aber warum sollte es funktionieren?
-
maphelpneeded schrieb:
Was es auch nicht unbedingt besser macht. Ich könnte jetzt den operator< definieren mit einem wahllosen Verhalten und es würde funktionieren (einfach irgendwie true oder false zurückgeben). Gibts da nicht irgendwas elegantes?
Gruß
Drängt sich denn die Ordnung nach deiner ordinal_number nicht irgendwie auf? Genau das ist doch die Bedeutung von ordinal number: Ordnungszahl.
-
Furble Wurble schrieb:
Es würde kompilieren, aber warum sollte es funktionieren?
Es würde funktionieren solange http://en.wikipedia.org/wiki/Strict_weak_ordering#Strict_weak_orderings erfüllt ist. Ansonsten nicht, soweit hast du recht.
@SeppJ Ja, hatte das jetzt auch anhand dessen implementiert. Danke für die Bestätigung.
Grüße
-
Bemerkung: Dir ist aber schon bekannt, dass es nicht unbedingt ein Operator< sein muss? Die map kann mit jedem funktionsartigen Ding zurecht kommen, das zwei Elemente nimmt und daraus einen bool macht. Nicht das all deine Probleme darauf beruhen, dass du keinen operator< haben möchtest.
maphelpneeded schrieb:
Es würde funktionieren solange http://en.wikipedia.org/wiki/Strict_weak_ordering#Strict_weak_orderings erfüllt ist. Ansonsten nicht, soweit hast du recht.
Dein
Ich könnte jetzt den operator< definieren mit einem wahllosen Verhalten
klang so, als würdest du die Ordnung nicht beachten wollen.