Ошибка компиляции стратегии расстояния геометрии Boost 1.65.1 с Visual Studio 2017

При попытке скомпилировать мой проект с новой версией boost 1.65.1 я получаю следующую ошибку:

C:\Users\twozn\Dev\soundtoolkit\stk\libraries\boost/geometry/strategies/distance.hpp(101): error C2664: 'int boost::mpl::assertion_failed<false>(boost::mpl::assert<false>::type)': cannot convert argument 1 from 'boost::mpl::failed ************(__cdecl boost::geometry::strategy::distance::services::default_strategy<boost::geometry::point_tag,boost::geometry::segment_tag,boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>,boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>,boost::geometry::cartesian_tag,boost::geometry::cartesian_tag,void>::NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE_COMBINATION::* ***********)(boost::mpl::assert_::types<Point1,Point2,CsTag1,CsTag2>)' to 'boost::mpl::assert<false>::type'
1>        with
1>        [
1>            Point1=boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>,
1>            Point2=boost::geometry::model::point<float,2,boost::geometry::cs::cartesian>,
1>            CsTag1=boost::geometry::cartesian_tag,
1>            CsTag2=boost::geometry::cartesian_tag
1>        ]

который запускается строкой

std::vector<Value> results;
rtree.query(boost::geometry::index::nearest(Point(p.x, p.y), 1), std::back_inserter(results));

где rtree выше определяется как

using Point = boost::geometry::model::point<float, 2,boost::geometry::cs::cartesian>;
using Segment = boost::geometry::model::segment<Point>;
using Value = std::pair<Segment, size_t>;
boost::geometry::index::rtree<Value, boost::geometry::index::rstar<16>> rtree;

Срабатывает утверждение (boost/geometry/strategies/distance.hpp):

template
<
    typename GeometryTag1,
    typename GeometryTag2,
    typename Point1,
    typename Point2 = Point1,
    typename CsTag1 = typename cs_tag<Point1>::type,
    typename CsTag2 = typename cs_tag<Point2>::type,
    typename UnderlyingStrategy = void
>
struct default_strategy
{
    BOOST_MPL_ASSERT_MSG
        (
            false, NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE_COMBINATION
            , (types<Point1, Point2, CsTag1, CsTag2>)
        );
};

Это скомпилировано и правильно работает с Boost 1.64.0. Компилятор — Visual Studio 2017 Update 1. В чем проблема?


person tomi.lee.jones    schedule 11.09.2017    source источник
comment
Можете ли вы опубликовать соответствующий бит статического утверждения? Он пытается вам что-то сказать, но вы обрезаете его. (Кроме того, тип results?)   -  person sehe    schedule 11.09.2017
comment
@sehe Я отредактировал вопрос с (надеюсь) соответствующими битами.   -  person tomi.lee.jones    schedule 11.09.2017


Ответы (1)


Не имея доступа к MSVC, я мог /догадаться/, что вам нужно включить больше заголовков. Возможно, они были косвенно включены в Boost 1.64.0.

Посмотрите, сможете ли вы скомпилировать следующий автономный пример:

Жить на Coliru

#include <boost/geometry/geometry.hpp>
#include <boost/geometry/core/coordinate_system.hpp>
#include <boost/geometry/geometries/segment.hpp>
#include <boost/geometry/index/predicates.hpp>

using Point   = boost::geometry::model::point<float, 2,boost::geometry::cs::cartesian>;
using Segment = boost::geometry::model::segment<Point>;
using Value   = std::pair<Segment, size_t>;

int main() {
    boost::geometry::index::rtree<Value, boost::geometry::index::rstar<16>> rtree;

    std::vector<Value> results;
    rtree.query(boost::geometry::index::nearest(Point(1, 2), 1), std::back_inserter(results));
}
person sehe    schedule 11.09.2017
comment
Спасибо @sehe, в том числе <boost/geometry/index/predicates.hpp> исправил. - person tomi.lee.jones; 13.09.2017
comment
Похоже, что обязательное включение могло снова измениться. Включение <boost/geometry/index/predicates.hpp> не работает для меня с Boost 1.67, но ленивый выход и включение <boost/geometry/geometry.hpp> работает нормально - person awksp; 02.08.2018
comment
Boost 1.68: у меня была та же проблема, я обнаружил, что нужны оба заголовка <boost/geometry/strategies/strategies.hpp> и <boost/geometry/algorithms/comparable_distance.hpp>. С ними долго компилируемый <boost/geometry.hpp> можно пропустить. - person TheOperator; 17.09.2018