"недопустимые операнды в бинарном выражении" при использовании Boost.Geometry? - PullRequest
1 голос
/ 11 октября 2011

Я получаю длинную ошибку компилятора, когда я пытаюсь увеличить разностную функцию геометрии, в то время как объединение и пересечение, которые имеют тот же интерфейс и, вероятно, связаны с реализацией работы:

bg::unique_(OldPolygon, Node->Polygon, NodePolygon); // compiles
bg::intersection(OldPolygon, Node->Polygon, NodePolygon); // compiles
bg::difference(OldPolygon, Node->Polygon, NodePolygon); // dies

Первая ошибка:

boost/range/size.hpp:32:13: error: invalid operands to
    binary expression ('
         boost::reverse_iterator<
             __gnu_cxx::__normal_iterator<
                 const GraphPoint *,
                 std::vector<
                     GraphPoint,
                     std::allocator<GraphPoint>
                 >
             >
         >' and 'int')
            BOOST_ASSERT( (boost::end(rng) - boost::begin(rng)) >= 0 &&
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Кажется, по какой-то причине разница итератора возвращает обратный итератор вместо расстояния ...

Типы объявлены как:

namespace bg = boost::geometry;

struct GraphPoint
{
    int x, y;
    GraphPoint(int x, int y) : x(x), y(y) { }
    GraphPoint() : x(0), y(0) { }
    GraphPoint(const GraphPoint &other) : x(other.x), y(other.y) { }

    bool operator ==(const GraphPoint &other) const
    {
        return x == other.x && y == other.y;
    }
};

BOOST_GEOMETRY_REGISTER_POINT_2D(GraphPoint, int, bg::cs::cartesian, x, y)

typedef bg::model::polygon<GraphPoint> Polygon;
typedef Polygon::ring_type Ring;
typedef bg::model::multi_polygon<Polygon> MultiPolygon;

MultiPolygon OldPolygon;
struct Node
{
    Polygon Polygon;
}
MultiPolygon NodePolygon;

Полная ошибка в здесь если кто-то любит копать.
Как мне сделать этот компилятор?

1 Ответ

0 голосов
/ 16 ноября 2011

Я успешно скомпилировал пример на основе вашего примера с:

  • VS2005 SP1 (Vista x64)
  • boost 1.48.0 (только что скачано)

Мне пришлось изменить структуру Node , вот код:

#include <boost/geometry/geometry.hpp> 
#include <boost/geometry/geometries/register/point.hpp>
#include <boost/geometry/geometries/register/ring.hpp>
#include <boost/geometry/geometries/geometries.hpp>
#include <boost/geometry/multi/geometries/multi_polygon.hpp> // boost 1_48_0
//#include <boost/geometry/multi/geometries/multi_geometries.hpp> // if boost comes from SVN

namespace bg = boost::geometry;

struct GraphPoint
{
    int x, y;
    GraphPoint(int x, int y) : x(x), y(y) { }
    GraphPoint() : x(0), y(0) { }
    GraphPoint(const GraphPoint &other) : x(other.x), y(other.y) { }

    bool operator ==(const GraphPoint &other) const
    {
        return x == other.x && y == other.y;
    }
};

BOOST_GEOMETRY_REGISTER_POINT_2D(GraphPoint, int, bg::cs::cartesian, x, y)

typedef bg::model::polygon<GraphPoint> Polygon;
typedef Polygon::ring_type Ring;
typedef bg::model::multi_polygon<Polygon> MultiPolygon;

MultiPolygon OldPolygon;
MultiPolygon NodePolygon;

struct Node
{
    Polygon p;
} node;

int main(int argc, char* argv[])
{
    bg::unique(OldPolygon); // only one parameter
    bg::intersection(OldPolygon, node.p, NodePolygon);
    bg::difference(OldPolygon, node.p, NodePolygon);

    return 0;
}

Я получаю два предупреждения (warning C4244: '=' : conversion from 'double' to 'int', possible loss of data), но он компилируется.

...