Увеличение диапазона с 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) действительно позволяет программе компилироваться.
Значит ли это, что это просто ошибка?