"enrique" <look@mysignature.txt> wrote
> Jeg er ved at "oversætte" et program jeg har skrevet i Java, til C++ for
at
> lære C++. Jeg er løbet ind i et problem når jeg skal indsætte et objekt i
> et set. Og jeg fatter simpelt hen ikke fejlen:
Det er almindeligt og forståeligt at man lige mister overblikket, de første
gange man får sådan en fejlmelding smidt i hovedet.
>
> g++ -Wall -c -o Budget.o Budget.cpp
>
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/include/g++-v3/bits/stl_function.h:
In
> member function `bool std::less<_Tp>:
erator()(const _Tp&, const
_Tp&)
> const [with _Tp = Entry]':
>
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/include/g++-v3/bits/stl_tree.h:1042
: instantiated from `std::pair<std::_Rb_tree_iterator<_Val, _Val&, _Val*>,
bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare,
_Alloc>::insert_unique(const _Val&) [with _Key = Entry, _Val = Entry,
_KeyOfValue = std::_Identity<Entry>, _Compare = std::less<Entry>, _Alloc =
std::allocator<Entry>]'
>
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/include/g++-v3/bits/stl_set.h:155:
instantiated from `std::pair<std::_Rb_tree<_Key, _Key, std::_Identity<_Key>,
_Compare, _Alloc>::const_iterator, bool> std::set<_Key, _Compare,
_Alloc>::insert(const _Key&) [with _Key = Entry, _Compare =
std::less<Entry>, _Alloc = std::allocator<Entry>]'
<OBS !!! Den vigtige del af fejlmeldingen>
> Budget.cpp:87: instantiated from here
>
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.1/include/g++-v3/bits/stl_function.h:
197: no
> match for `const Entry& < const Entry&' operator
</OBS !!! Den vigtige del af fejlmeldingen>
> make: *** [Budget.o] Fejl 1
Ja, det er jo en hurtig lille fejlmelding, hvor man nemt kan se hvad der er
galt :-/
Man vænner sig til den slags fejlmeldinger, så fat mod.
Alternativt kan det være en idee at kigge på STLFilt
(
http://www.bdsoft.com/tools/stlfilt.html) - den er efter sigende ikke så
tosset endda.
[8<8<8<]
> Jeg håber der er en der vil hjælpe mig, evt henvise mig til en side hvor
> problemet står forklaret.
Nøglen til at forstå problemet, er at forstå klassen "std::set".
Set er en container, der understøtter unike nøgler. Det betyder at den skal
have en måde at sammenligne nøglen for forskellige objekter på.
Den fuldstændige erklæring af template klassen "std::set" er
template <class Key, class Compare = less<Key>,
class Allocator = allocator<Key> >
class set;
hvor du kan se at første template argument er er typen på objekter som skal
opbevares.
Andet template argument er algoritmen der skal bruges til at sammenligne
nøglen for 2 objekter. Default er "std::less" som simpelthen bruger "<".
Her har du så dit problem:
Du har ikke specifieret hvordan "std::set" skal sammenligne 2 "Entry"
objekter, så derfor bruger den default og prøver at finde
bool operator<(const Entry&, const Entry&);
som formodentlig ikke findes.
Løsningen er defor en af følgende
* Gør det muligt for "std::set" at sammenligne 2 objekter
* Brug en anden container type (f.eks. "std::vector") og tænk lige over
hvorfor du valgte "std::set" til at begynde med (det er en glimrende
container)
En anden ting du skal være opmærksom på, er at alle containerne i C++
Standard Library gemmer objekterne by-value. De tager alså en kopi af
objektet og gemmer det - det er således ikke en pointer eller reference der
gemmes. Altså en opførsel som array i core-language.
Venlig hilsen
Mogens Hansen
PS
Det svære ved at oversætte et program fra et sprog til et andet er ikke så
meget syntaksen, som det er at forstå hvordan "det nye" sprog bruges på en
god måde.
Jeg kan varmt anbefale at kigge på bogen
Accelerated C++
Andrew Koenig, Barbara E. Moo
ISBN 0-201-70353-X
som er vældigt god (men dog ikke ville have hjulpet dig med dit konkrete
spørgsmål)