次のプログラム:std :: istreambuf_iteratorがなぜブーストのSinglePassIteratorコンセプトチェックに失敗するのですか?
#include <boost/range/concepts.hpp>
#include <iterator>
#include <istream>
using boost::range_detail::SinglePassIteratorConcept;
int main()
{
BOOST_CONCEPT_ASSERT((SinglePassIteratorConcept<std::istreambuf_iterator<char>>));
}
はMSVCとgccの両方でコンパイルに失敗します。次のようにMSVCエラーがある:
D:\libraries\boost\boost/range/concepts.hpp(157) : error C2440: 'initializing' : cannot convert from 'char' to 'char &'
D:\libraries\boost\boost/range/concepts.hpp(147) : while compiling class template member function 'boost::range_detail::SinglePassIteratorConcept<Iterator>::~SinglePassIteratorConcept(void)'
with
[
Iterator=std::istreambuf_iterator<char,std::char_traits<char>>
]
D:\libraries\boost\boost/concept/detail/has_constraints.hpp(42) : see reference to class template instantiation 'boost::range_detail::SinglePassIteratorConcept<Iterator>' being compiled
with
[
Iterator=std::istreambuf_iterator<char,std::char_traits<char>>
]
D:\libraries\boost\boost/concept/detail/msvc.hpp(58) : see reference to class template instantiation 'boost::concepts::not_satisfied<Model>' being compiled
with
[
Model=boost::range_detail::SinglePassIteratorConcept<std::istreambuf_iterator<char,std::char_traits<char>>>
]
test.cpp(10) : see reference to class template instantiation 'boost::concepts::require<Model>' being compiled
with
[
Model=boost::range_detail::SinglePassIteratorConcept<std::istreambuf_iterator<char,std::char_traits<char>>>
]
D:\libraries\boost\boost/range/concepts.hpp(160) : error C2440: 'initializing' : cannot convert from 'char' to 'char &'
その結果、boost::copy
ようBoost.Rangeアルゴリズムはistreambuf_iterator
では動作しません。
ここでは何が起こっていますか?それを修正したり回避したりするにはどうすればよいですか?
EDIT:エラーの近因はistreambuf_iterator
のreference_type
がchar&
であることのようですが、それはoperator*
戻りchar
です。整形式イテレータの場合、operator*
は常にreference_type
を返すべきではありませんか?
idkですが、それは良いキャッチだと思われます! :-)おそらくブーストメーリングリストでそれを尋ねます。 –