priority_queue mit eigenem Typ => Fehler
-
Hi,
Das ist das erste mal, dass ich die priority_queue nutze und irgendwie hauts auch nicht so richtig hin.
Compileroutput:g++ -g `pkg-config gtk+-2.0 --cflags` `wx-config --cppflags` -c Resources/Autotileset.cpp /usr/include/c++/4.2/bits/stl_function.h: In member function ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Autotileset::ImageGenerator::Rule]’: /usr/include/c++/4.2/bits/stl_heap.h:279: instantiated from ‘void std::__adjust_heap(_RandomAccessIterator, _Distance, _Distance, _Tp, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Autotileset::ImageGenerator::Rule*, std::vector<Autotileset::ImageGenerator::Rule, std::allocator<Autotileset::ImageGenerator::Rule> > >, _Distance = long int, _Tp = Autotileset::ImageGenerator::Rule, _Compare = std::less<Autotileset::ImageGenerator::Rule>]’ /usr/include/c++/4.2/bits/stl_heap.h:404: instantiated from ‘void std::make_heap(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Autotileset::ImageGenerator::Rule*, std::vector<Autotileset::ImageGenerator::Rule, std::allocator<Autotileset::ImageGenerator::Rule> > >, _Compare = std::less<Autotileset::ImageGenerator::Rule>]’ /usr/include/c++/4.2/bits/stl_queue.h:353: instantiated from ‘std::priority_queue<_Tp, _Sequence, _Compare>::priority_queue(const _Compare&, const _Sequence&) [with _Tp = Autotileset::ImageGenerator::Rule, _Sequence = std::vector<Autotileset::ImageGenerator::Rule, std::allocator<Autotileset::ImageGenerator::Rule> >, _Compare = std::less<Autotileset::ImageGenerator::Rule>]’ Resources/Autotileset.cpp:69: instantiated from here /usr/include/c++/4.2/bits/stl_function.h:227: error: passing ‘const Autotileset::ImageGenerator::Rule’ as ‘this’ argument of ‘bool Autotileset::ImageGenerator::Rule::operator<(const Autotileset::ImageGenerator::Rule&)’ discards qualifierrelevanter Code:
class Rule { public: Rule(char conditions, shared::Tilelocation tile[4]); bool operator<(const Rule&); bool operator>(const Rule&); // [... andere Funktionsdeklarationen ...] }; std::priority_queue<Rule> rules;
-
wuerde mal auf den operator< tippen.
korrekterweise ist der non member.
wenn du ihn aber aus unerfindlichen gruenden als member haben willst, dann mach ihn wenigstens const.
-
warum sollte man es nicht als Member machen?
KOnstant funktioniert es aber, danke
-
JustAnotherNoob schrieb:
warum sollte man es nicht als Member machen?
KOnstant funktioniert es aber, dankegegenfrage:
warum sollte man es als member machen?man kann nicht alle operator< als member haben, denn zB string<Rule
wuerde als member nicht funktionieren...also muss man sowieso mal einen grossen teil der operatoren als non member haben. dann kann man gleich alle nehmen.
alles was non member sein kann, sollte non member sein.
-
Hier noch ein interessanter Bericht über Kapselung und non- Member Functions:
http://www.ddj.com/cpp/184401197Simon