карты, итераторы и сложные структуры - ошибки STL - PullRequest
2 голосов
/ 29 марта 2010

Итак, у меня есть две структуры:

struct coordinate {
    float x;
    float y;
}

struct person {
    int id;
    coordinate location;
}

и функция, работающая с координатами:

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

В моем основном методе у меня есть следующий код:

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;
    }
}

Однако при сборке я получаю следующую ошибку:

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’

И он обвиняет в этом:

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

Почему STL жалуется на мой код?

Ответы [ 2 ]

6 голосов
/ 29 марта 2010

В стандартной библиотеке есть функция std::distance, которая работает на итераторах. Похоже, компилятор пытается вызвать его вместо вашего. Я бы удалил директиву using namespace std;, если вы ее используете, и просто сказал бы using std::map; и т. Д.

2 голосов
/ 29 марта 2010

Поскольку у вас, вероятно, где-то есть using namespace std;, компилятор смешивает вашу функцию float distance(const coordinate& c1, const coordinate& c2) с функциями из заголовка 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);
...