Форум программистов, компьютерный форум CyberForum.ru

Составной ключ для std::map - C++

Восстановить пароль Регистрация
 
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
18.11.2012, 20:02     Составной ключ для std::map #1
Есть класс. Нужно его сделать ключем для карты.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Vertex{
public:
    double X,Y,Z;
    Vertex(double x=0,double y=0, double z=0){X=x;Y=y;Z=z;}
    void Set(double x,double y,double z){X=x;Y=y;Z=z;}
    void print(){printf("X=%f, Y=%f, Z=%f\n",X,Y,Z);}
    double L(){return Sqrt((X*X)+(Y*Y)+(Z*Z));}
    double L(Vertex A){return Sqrt((X*X-2*X*A.X+A.X*A.X)+(Y*Y-2*Y*A.Y+A.Y*A.Y)+(Z*Z-2*Z*A.Z+A.Z*A.Z));}
    bool operator  <(double A){return (X<A && Y<A && Z<A);}
    bool operator  >(double A){return (X>A && Y>A && Z>A);}
    bool operator ==(Vertex A){return (X==A.X && Y==A.Y && Z==A.Z);}
    bool operator  <(Vertex A){return std::tie(X, Y, Z) < std::tie(A.X, A.Y, A.Z);}
    bool operator ==(double A){return (X==A && Y==A && Z==A);}
    bool operator !=(double A){return (X!=A || Y!=A || Z!=A);}
    bool operator !=(Vertex A){return (X!=A.X || Y!=A.Y || Z!=A.Z);}
    void operator +=(Vertex A){X+=A.X;Y+=A.Y;Z+=A.Z;}
    void operator +=(double A){X+=A;Y+=A;Z+=A;}
    void operator *=(Vertex A){X*=A.X;Y*=A.Y;Z*=A.Z;}
    void operator *=(double A){X*=A;Y*=A;Z*=A;}
    void operator /=(double A){X/=A;Y/=A;Z/=A;}
    void operator -=(Vertex A){X-=A.X;Y-=A.Y;Z-=A.Z;}
    void operator  =(double A){X=A;Y=A;Z=A;}
    Vertex operator *(double A){return Vertex(X*A,Y*A,Z*A);}
    Vertex operator -(Vertex A){return Vertex(X-A.X,Y-A.Y,Z-A.Z);}
    Vertex operator +(Vertex A){Vertex Res=*this;Res+=A;return Res;}
    double GetA(){return X/L();}
    double GetB(){return Y/L();}
    double GetC(){return Z/L();}
    bool Null(){if(X==0 && Y==0 && Z==0)return 1;return 0;}
    Vertex Normalize(){double l=Sqrt((X)*(X)+(Y)*(Y)+(Z)*(Z));X/=l;Y/=l;Z/=l;return *this;}
};
int main(){
    Vertex A;
    std::map<Vertex,int> C;
    C[A]=231;
}
вот лог ошибок.
In file included from /usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/string:50:0,
from /usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/bits/locale_classes.h:42,
from /usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/bits/ios_base.h:43,
from /usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/ios:43,
from /usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/istream:40,
from /usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/fstream:40,
from Collision.h:10,
from Actor.h:5,
from main.cpp:12:
/usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/bits/stl_function.h: In instantiation of «bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Vertex]»:
/usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/bits/stl_map.h:471:2: required from «std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](std::map<_Key, _Tp, _Compare, _Alloc>::key_type&&) [with _Key = Vertex; _Tp = std::basic_string<char>; _Compare = std::less<Vertex>; _Alloc = std::allocator<std:air<const Vertex, std::basic_string<char> > >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = std::basic_string<char>; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = Vertex]»
Collision.h:610:19: required from here
/usr/lib64/gcc/x86_64-slackware-linux/4.7.1/../../../../include/c++/4.7.1/bits/stl_function.h:237:22: ошибка: passing «const Vertex» as «this» argument of «bool Vertex::operator<(Vertex)» discards qualifiers [-fpermissive]

Заранее спасибо за ответы.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.11.2012, 20:08     Составной ключ для std::map #2
операторы отношения изменяют состояние класса?
нет
тогда почему какого дьявола они не константные?
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
18.11.2012, 20:15  [ТС]     Составной ключ для std::map #3
Jupiter, та-же фигня, что и была.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Vertex{
public:
    double X,Y,Z;
    Vertex(double x=0,double y=0, double z=0){X=x;Y=y;Z=z;}
    void Set(double x,double y,double z){X=x;Y=y;Z=z;}
    void print(){printf("X=%f, Y=%f, Z=%f\n",X,Y,Z);}
    double L(){return Sqrt((X*X)+(Y*Y)+(Z*Z));}
    double L(Vertex A){return Sqrt((X*X-2*X*A.X+A.X*A.X)+(Y*Y-2*Y*A.Y+A.Y*A.Y)+(Z*Z-2*Z*A.Z+A.Z*A.Z));}
    const bool operator  <(double A){return (X<A && Y<A && Z<A);}
    const bool operator  >(double A){return (X>A && Y>A && Z>A);}
    const bool operator ==(Vertex A){return (X==A.X && Y==A.Y && Z==A.Z);}
    const bool operator  <(Vertex A){return std::tie(X, Y, Z) < std::tie(A.X, A.Y, A.Z);}
    const bool operator ==(double A){return (X==A && Y==A && Z==A);}
    const bool operator !=(double A){return (X!=A || Y!=A || Z!=A);}
    const bool operator !=(Vertex A){return (X!=A.X || Y!=A.Y || Z!=A.Z);}
    void operator +=(Vertex A){X+=A.X;Y+=A.Y;Z+=A.Z;}
    void operator +=(double A){X+=A;Y+=A;Z+=A;}
    void operator *=(Vertex A){X*=A.X;Y*=A.Y;Z*=A.Z;}
    void operator *=(double A){X*=A;Y*=A;Z*=A;}
    void operator /=(double A){X/=A;Y/=A;Z/=A;}
    void operator -=(Vertex A){X-=A.X;Y-=A.Y;Z-=A.Z;}
    void operator  =(double A){X=A;Y=A;Z=A;}
    Vertex operator *(double A){return Vertex(X*A,Y*A,Z*A);}
    Vertex operator -(Vertex A){return Vertex(X-A.X,Y-A.Y,Z-A.Z);}
    Vertex operator +(Vertex A){Vertex Res=*this;Res+=A;return Res;}
    double GetA(){return X/L();}
    double GetB(){return Y/L();}
    double GetC(){return Z/L();}
    bool Null(){if(X==0 && Y==0 && Z==0)return 1;return 0;}
    Vertex Normalize(){double l=Sqrt((X)*(X)+(Y)*(Y)+(Z)*(Z));X/=l;Y/=l;Z/=l;return *this;}
};
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
18.11.2012, 20:17     Составной ключ для std::map #4
Invader_Zim, добавленные вами const никаким образом не относятся к проблеме, указанной Jupiter-ом.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
18.11.2012, 20:20  [ТС]     Составной ключ для std::map #5
все, решил.
Yandex
Объявления
18.11.2012, 20:20     Составной ключ для std::map
Ответ Создать тему
Опции темы

Текущее время: 18:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru