C ++ ссылочные переменные - PullRequest
       21

C ++ ссылочные переменные

0 голосов
/ 23 апреля 2010

У меня есть эти две функции (с классами Point2D и LineVector (имеет 2 переменных-члена Point2D) и предопределенным макросом SQUARE)

inline float distance(const Point2D &p1,const Point2D &p2) {
    return sqrt(SQUARE(p2.getX()-p1.getX())+SQUARE(p2.getY()-p1.getY()));
}

inline float maxDistance(const LineVector &lv1,const LineVector &lv2) {
    return max(distance(lv1.p1,lv2.p2),distance(lv1.p2,lv2.p1));
}

но выдает ошибку компиляции в функции maxDistance () (строка 238), говоря:

/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_iterator_base_types.h: In instantiation of `std::iterator_traits<Point2D>':
quadrilateral.cpp:238:   instantiated from here
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_iterator_base_types.h:129: error: no type named `iterator_category' in `class 
Point2D'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_iterator_base_types.h:130: error: no type named `value_type' in `class Point2D
'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_iterator_base_types.h:131: error: no type named `difference_type' in `class Point2D'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_iterator_base_types.h:132: error: no type named `pointer' in `class Point2D'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_iterator_base_types.h:133: error: no type named `reference' in `class Point2D'

Подскажите пожалуйста в чем ошибка?

Ответы [ 3 ]

0 голосов
/ 23 апреля 2010

Похоже, вы можете вызывать std :: distance вместо своей собственной функции distance. Есть несколько причин, по которым это может происходить, но обычно это происходит из-за безвозмездного использования

using namespace std;

Попробуйте явно использовать пространство имен или имя класса при вызове функции расстояния или, если оно находится в глобальном пространстве имен

float result = ::distance(point1, point2);
0 голосов
/ 23 апреля 2010

Может быть, компилятор интерпретирует дистанционный вызов как std :: distance? Вы использовали пространство имен std перед этим кодом? Попробуйте переименовать функцию расстояния и посмотрите, что получится.

0 голосов
/ 23 апреля 2010

Point2D должен наследоваться от std::iterator, прежде чем он будет правильно размещен с помощью std :: distance. std::distance нужны некоторые определения типов, предоставляемые стандартным типом итератора, чтобы использовать правильный метод измерения расстояния.

РЕДАКТИРОВАТЬ: я предполагаю, что Point2D должен быть итератором. Если вы предполагаете, std::distance - формула расстояния, вы ошибаетесь. std::distance возвращает разницу в положении между двумя итераторами, указывающими на общий контейнер.

...