Увеличение диапазона с MSVC2017 приводит к неизвестной ошибке спецификатора переопределения

Следующая программа

#include <vector>
#include <boost/range/join.hpp>

int main() {
    std::vector<int> a{1, 2, 3};
    std::vector<int> b{4, 5, 6};
    boost::join(a, b);
}

Скомпилировано со следующей командной строкой:

/GS /W4 /Zc:wchar_t /ZI /Gm /Od /sdl /Fd"x64\Debug\vc141.pdb" /Zc:inline /fp:precise /D "BOOST_LIB_TOOLSET=\"vc141\"" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /std:c++latest /Fa"x64\Debug\" /EHsc /nologo /Za /Fo"x64\Debug\" /Fp"x64\Debug\Project11.pch" /diagnostics:classic 

Выдает следующие ошибки:

1>------ Build started: Project: Project11, Configuration: Debug x64 ------
1>Source.cpp
1>c:\boost\include\boost-1_64\boost\range\detail\join_iterator.hpp(252): error C3646: 'dereference': unknown override specifier
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\xutility(622): note: see reference to class template instantiation 'boost::range_detail::join_iterator<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>,int,int &,boost::range_detail::inner_demote_iterator_traversal_tag<boost::iterators::random_access_traversal_tag,boost::iterators::random_access_traversal_tag>::type>' being compiled
1>c:\boost\include\boost-1_64\boost\iterator\iterator_categories.hpp(119): note: see reference to class template instantiation 'std::iterator_traits<Iterator>' being compiled
1>        with
1>        [
1>            Iterator=boost::range_detail::join_iterator<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>,int,int &,boost::range_detail::inner_demote_iterator_traversal_tag<boost::iterators::random_access_traversal_tag,boost::iterators::random_access_traversal_tag>::type>
1>        ]
1>c:\boost\include\boost-1_64\boost\range\iterator_range_core.hpp(156): note: see reference to class template instantiation 'boost::iterators::iterator_traversal<IteratorT>' being compiled
1>        with
1>        [
1>            IteratorT=boost::range_detail::join_iterator<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>,int,int &,boost::range_detail::inner_demote_iterator_traversal_tag<boost::iterators::random_access_traversal_tag,boost::iterators::random_access_traversal_tag>::type>
1>        ]
1>c:\boost\include\boost-1_64\boost\range\iterator_range_core.hpp(436): note: see reference to class template instantiation 'boost::iterator_range_detail::pure_iterator_traversal<IteratorT>' being compiled
1>        with
1>        [
1>            IteratorT=boost::range_detail::join_iterator<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>,int,int &,boost::range_detail::inner_demote_iterator_traversal_tag<boost::iterators::random_access_traversal_tag,boost::iterators::random_access_traversal_tag>::type>
1>        ]
1>c:\boost\include\boost-1_64\boost\range\join.hpp(45): note: see reference to class template instantiation 'boost::iterator_range<boost::range_detail::join_iterator<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>,int,int &,boost::range_detail::inner_demote_iterator_traversal_tag<boost::iterators::random_access_traversal_tag,boost::iterators::random_access_traversal_tag>::type>>' being compiled
1>c:\users\rex\documents\visual studio 2017\projects\project11\project11\source.cpp(7): note: see reference to class template instantiation 'boost::range::joined_range<std::vector<int,std::allocator<_Ty>>,std::vector<_Ty,std::allocator<_Ty>>>' being compiled
1>        with
1>        [
1>            _Ty=int
1>        ]
1>c:\boost\include\boost-1_64\boost\range\detail\join_iterator.hpp(252): error C2059: syntax error: '('
1>c:\boost\include\boost-1_64\boost\range\detail\join_iterator.hpp(253): error C2334: unexpected token(s) preceding '{'; skipping apparent function body
1>c:\boost\include\boost-1_64\boost\range\detail\join_iterator.hpp(263): error C2061: syntax error: identifier 'difference_type'
1>c:\boost\include\boost-1_64\boost\range\detail\join_iterator.hpp(271): error C3646: 'distance_to': unknown override specifier
1>c:\boost\include\boost-1_64\boost\range\detail\join_iterator.hpp(271): error C2059: syntax error: '('
1>c:\boost\include\boost-1_64\boost\range\detail\join_iterator.hpp(272): error C2334: unexpected token(s) preceding '{'; skipping apparent function body
1>c:\boost\include\boost-1_64\boost\range\detail\join_iterator.hpp(299): error C2061: syntax error: identifier 'difference_type'
1>c:\boost\include\boost-1_64\boost\range\detail\join_iterator.hpp(321): error C2061: syntax error: identifier 'difference_type'
1>Done building project "Project11.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Я использую Boost 1.64, скомпилированный с MSVC2017 (toolset v141), но я не уверен, как это может привести к этим ошибкам.

Первая ошибка в join_iterator.hpp(252) и строка

typename join_iterator::reference dereference() const

Я не понимаю, почему компилятор считает dereference как спецификатор переопределения. Что нужно исправить, чтобы сделать эту компиляцию?

Попробовав несколько вариантов предложенных комментариев, я обнаружил, что переключение набора инструментов платформы с v141 на v140 (с VS2015) действительно позволяет программе компилироваться.

Значит ли это, что это просто ошибка?

0 ответов

Другие вопросы по тегам