В прошлом я использовал библиотеку GGL для написания некоторых программ. Например, следующий код хорошо работает с GGL и старой версией gcc. Теперь я обновляю gcc до gcc4.7.1. В моей программе появляются ошибки при компиляции. Таким образом, я обновляю до последней версии boost 1.52.1. все еще есть ошибки, связанные с point_2d, polygon_2d и т. д. Я обнаружил, что некоторые файлы, такие как ‘cartesian2d.hpp’, ‘c_array_cartesian.hpp’ отсутствуют в последнем улучшении версии.
Может ли кто-нибудь помочь мне проанализировать следующий код и сказать, в чем проблема? Большое спасибо.
#include <iostream>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/algorithms/distance.hpp>
#include <boost/geometry/geometry.hpp>
#include <algorithm> // for reverse, unique
#include <iostream>
#include <string>typedef boost::geometry::model::d2::point_xy<double,
boost::geometry::cs::cartesian> point_2d;
typedef boost::geometry::model::polygon<point_2d> polygon_2d;
using namespace boost::geometry;
int main() {
std::cout << "!!!Hello World!!!" << std::endl; // prints !!!Hello World!!!
model::d2::point_xy<int> p1(1.0, 1.0), p2(2.0, 2.0);
point_2d x(3.0,3.0);
std::cout << x.x();
std::cout << "Distance p1-p2 is: " << distance(p1, p2) <<std::endl;
float width = 100;
float length = 100;polygon_2d poly;
{
const float coor[][2] = {
{-350.0,-500.0}, {350,-500}, {350, 0}, {width/2.0, 0}, {width/2.0, length},
{350, length}, {350, 1000}, {-350, 1000}, {-350, length}, {-1*width/2.0, length}, {-1*width/2.0,0},
{-350, 0}, {-350.0,-500.0} // closing point is opening point
};
assign(poly, coor);
}
correct(poly);
return 0;
}
Ошибки следующие:
c:\program files\mingw64\bin\../lib/gcc/x86_64-w64-mingw32/4.7.1/
../../../../include/boost/geometry/core/point_order.hpp:1
57:12: required from 'const boost::geometry::order_selector
boost::geometry::point_order<float [13][2]>::value'
c:\program files\mingw64\bin\../lib/gcc/x86_64-w64-
mingw32/4.7.1/../../../../include/boost/geometry/algorithms/
assign.hpp:148:70: required from 'void
boost::geometry::assign(Geometry1&, const Geometry2&) [with
Geometry1 =boost::geometry::model::polygon<boost::geometry::model
::d2::point_xy<double, boost::geometry::cs::cartesian> >;
Geometry2 = float [13][2]]'
..\src\test.cpp:47:44: required from here
c:\program files\mingw64\bin\../lib/gcc/x86_64-w64-mingw32/4.7.1/
../../../../include/boost/geometry/core/point_order.hpp:95:5:
error: no matching function for call to
'assertion_failed(mpl_::failed************
(boost::geometry::core_dispatch::point_order<void, float [13]
[2]>::NOT_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE::************)
(mpl_::assert_::types<float [13][2], mpl_::na, mpl_::na,
mpl_::na>))'
Два изменения необходимы:
1) включите c_array.hpp, чтобы адаптировать двумерный массив с плавающей точкой (используется внутри const float [] [2]) к концепции точки Boost.Geometry:
#include <boost/geometry/geometries/adapted/c_array.hpp>
2) Используйте assign_points вместо assign.
assign_points(poly, coor);
Ваш код затем компилируется. Предыстория: вы использовали предварительную версию (конечно, разрешенную), при выпуске были сделаны небольшие изменения в интерфейсе. assign (с диапазоном) теперь называется assign_points.
Других решений пока нет …