2010-03-29 8 views
2

Donc, j'ai deux struct:cartes, itérateurs et structs complexes - erreurs STL

struct coordinate { 
    float x; 
    float y; 
} 

struct person { 
    int id; 
    coordinate location; 
} 

et une fonction d'exploitation sur les coordonnées:

float distance(const coordinate& c1, const coordinate& c2); 

Dans ma principale méthode, je donne les résultats suivants Code:

map<int,person> people; 
// populate people 
map<int,map<float,int> > distance_map; 
map<int,person>::iterator it1,it2; 
for (it1=people.begin(); it1!=people.end(); ++it1) { 
    for (it2=people.begin(); it2!=people.end(); ++it2) { 
     float d = distance(it1->second.location,it2->second.location); 
     distance_map[it1->first][d] = it2->first; 
    } 
} 

Cependant, je reçois l'erreur suivante sur la construction:

stl_iterator_base_types.h: In instantiation of ‘std::iterator_traits<coordinate>’: 
stl_iterator_base_types.h:129: error: no type named ‘iterator_category’ in ‘struct coordinate’ 
stl_iterator_base_types.h:130: error: no type named ‘value_type’ in ‘struct coordinate’ 
stl_iterator_base_types.h:131: error: no type named ‘difference_type’ in ‘struct coordinate’ 
stl_iterator_base_types.h:132: error: no type named ‘pointer’ in ‘struct coordinate’ 
stl_iterator_base_types.h:133: error: no type named ‘reference’ in ‘struct coordinate’ 

Et il blâme sur la ligne:

float d = distance(it1->second.location,it2->second.location); 

Pourquoi la STL se plaignent de mon code?

+1

Question sans importance: les flotteurs fonctionnent-ils pour une valeur-clé? – egrunin

Répondre

6

Il existe une fonction dans la bibliothèque standard appelée std::distance, qui fonctionne sur les itérateurs. Il semble donc que le compilateur essaie d'appeler celui-là à la place du vôtre. Je retire la directive using namespace std; si vous utilisez, et juste dire using std::map;, etc.

2

Puisque vous avez probablement un using namespace std; quelque part le compilateur brouille votre fonction float distance(const coordinate& c1, const coordinate& c2) avec les fonctions de l'en-tête algorithm.

template <class InputIterator> 
inline |stl-iterator_traits|<InputIterator>::difference_type 
distance(InputIterator first, InputIterator last); 

template <class |stl-InputIterator|, class Distance> 
void distance(InputIterator first, InputIterator last, Distance& n);