c++: set and class with set

Hi people,
I have an orrible error,someone can help me?
I post the code

file main.cpp
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <stdlib.h>
#include "Neighbor.h"
#include <set>
#include <map>



typedef int IDENTIFICATIVO;
typedef std::set<Neighbor> setNeighbor;
using namespace std;

setNeighbor getNeighbor(IDENTIFICATIVO nodo2);
Neighbor getLink(IDENTIFICATIVO nodo,Neighbor neighbor);
int main(){

setNeighbor myset=getNeighbor(10);
cout << "myset contains:";
setNeighbor::iterator it;

//  for ( it=myset.begin() ; it != myset.end(); it++ )
  //  cout << " " << *it; NEIGHBOR È UNA CLASSE NON POSSO STAMPARE COSI DEVO TROVARE UN MODO TIPO GETID
//Neighbor a=getLink(1,10);

return 0;
}

setNeighbor getNeighbor(IDENTIFICATIVO nodo){ //restituisce tutto l'insieme dei link uscenti da un nodo
 Neighbor vicino1(1,100,90,1,1);
Neighbor vicino2(2,100,50,2,2);
Neighbor vicino3(3,100,10,3,3);
Neighbor vicino4(4,100,10,5,5);
Neighbor myints[]= {vicino1,vicino2,vicino3,vicino4};
setNeighbor second (myints,myints+4);
map<IDENTIFICATIVO,setNeighbor > mapme; //ho la mappa posso scorrere tutti i miei Neighbor
mapme[1]=second; //inizializzato la mappa


map< IDENTIFICATIVO,setNeighbor >::iterator itmap;

itmap=mapme.find(nodo); //trovo il nodo a cui aggiungere i neighbor:TESTARE SE RESTITUISCE FALSO IN CASO DI NODO NN TROVATO E FARE UN IF
return (*itmap).second;
}


Neighbor getLink(IDENTIFICATIVO nodo,Neighbor neighbor){//restituisce il link specifico di un nodo tramite i 2 id,uno per l'insieme ed uno per l'elemento(foss id di Neighbor) specifico
Neighbor vicino1(1,100,90,1,1);
Neighbor vicino2(2,100,50,2,2);
Neighbor vicino3(3,100,10,3,3);
Neighbor vicino4(4,100,10,5,5);
Neighbor myints[]= {vicino1,vicino2,vicino3,vicino4};
  setNeighbor second (myints,myints+4);
map<IDENTIFICATIVO,setNeighbor > mapme; //ho la mappa posso scorrere tutti i miei Neighbor
mapme[1]=second; //inizializzato la mappa



setNeighbor myset= getNeighbor(nodo);//mi restituisce i vicini del nodo

return *(myset.find(neighbor));;

}


File neighbor.h

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
37
38
39
#ifndef __DATI_H__
#define __DATI_H__
#include <set>
#include <map>
#include <iostream>

using namespace std;//quando andrà integrato in ns3 mettere ns3 al posto di std

typedef int IDENTIFICATIVO;


//non uso una classe che identifica il link e una la radio,ma associo tutto al vicino
//cioè le info su flow e channel non sono in una classe link
// e le info su una radio non sono nella classe radio
class Neighbor
{private:
IDENTIFICATIVO id;
float capacity;
int flow;
int channel;
int radio;
	public:
	Neighbor(const IDENTIFICATIVO Cid =0,const float Ccapacity =0,const int Cflow=0,const int Cchannel=0,const int Cradio=0):id(Cid), capacity(Ccapacity), flow(Cflow), channel(Cchannel), radio(Cradio){};  //costruttore
    Neighbor( const Neighbor& neighbor1):id(neighbor1.id),capacity(neighbor1.capacity),flow(neighbor1.flow),channel(neighbor1.channel),radio(neighbor1.radio){} //costruttore di copia

     ~Neighbor(){}	//distruttore
	const IDENTIFICATIVO Getid()const{return id;};//funzione get per ottenere l'id del vicino
	const float Getcapacity() const{return capacity;};//funzione get per ottenere la capacità
	const int Getflow() const{return flow;};//funzione get per ottenere il flow
	const int Getchannel() const{return channel;};//funzione get per ottenere il canale
	const int Getradio() const{return radio;};//funzione get per ottenere l'id della radio
	void setid(IDENTIFICATIVO Id){id=Id;};//funzione per settare un nuovo valore di id per il vicino
	void setcapacity(float Capacity){capacity=Capacity;};	//funzione per settare un nuovo valore della capacità
	void setflow(int Flow){flow=Flow;};	//funzione per settare un nuovo valore di flusso
	void setchannel(int Channel){channel=Channel;};	//funzione per settare un nuovo valore del canale
	void setradio(int Radio){radio=Radio;};	//funzione per settare un nuovo valore dell'id della radio
};

#endif 


the error is:
/usr/include/c++/4.4/bits/stl_function.h|230|error: no match for ‘operator<’ in ‘__x < __y’|



the complete output about error is:

/usr/include/c++/4.4/bits/stl_function.h||In member function ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Neighbor]’:|
/usr/include/c++/4.4/bits/stl_tree.h|1212|instantiated from ‘std::_Rb_tree_iterator<_Val> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique_(std::_Rb_tree_const_iterator<_Val>, const _Val&) [with _Key = Neighbor, _Val = Neighbor, _KeyOfValue = std::_Identity<Neighbor>, _Compare = std::less<Neighbor>, _Alloc = std::allocator<Neighbor>]’|
/usr/include/c++/4.4/bits/stl_tree.h|1324|instantiated from ‘void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(_II, _II) [with _InputIterator = Neighbor*, _Key = Neighbor, _Val = Neighbor, _KeyOfValue = std::_Identity<Neighbor>, _Compare = std::less<Neighbor>, _Alloc = std::allocator<Neighbor>]’|
/usr/include/c++/4.4/bits/stl_set.h|161|instantiated from ‘std::set<_Key, _Compare, _Alloc>::set(_InputIterator, _InputIterator) [with _InputIterator = Neighbor*, _Key = Neighbor, _Compare = std::less<Neighbor>, _Alloc = std::allocator<Neighbor>]’|
/home/danilo/TESi/Contenitori/Test singole classi/LinkList/mainprova2.cpp|34|instantiated from here|
/usr/include/c++/4.4/bits/stl_function.h|230|error: no match for ‘operator<’ in ‘__x < __y’|
||=== Build finished: 1 errors, 0 warnings ===|

Thanks for all!

Also, if you want to use STL algorithms, in many cases you class needs to provide the '<' and/or '==' operator.

I really have troubles reading this code because it's in.. italian.. or portugiese... or something like that.

But it really seems like you just have to implement the "less than" operator for your class.
Last edited on
Yes, i'm italian.
I'm sorry for the comment in italian!
Today i solve my problem with implent operator < :
bool operator< (const Neighbor& b) const {return id < b.id;}
:)
thanks for your help!
Topic archived. No new replies allowed.