2010-12-28 5 views
3

:ブースト1.45でVS2008でboost :: iterator_facadeのboost :: range_detail :: demote_iterator_traversal_tagのバグですか?次のコード

error C2039: 'type' : is not a member of 'boost::range_detail::demote_iterator_traversal_tag<IteratorTraversalTag1,IteratorTraversalTag2>' 
1>  with 
1>  [ 
1>   IteratorTraversalTag1=boost::detail::iterator_category_with_traversal<std::input_iterator_tag,boost::random_access_traversal_tag>, 
1>   IteratorTraversalTag2=boost::detail::iterator_category_with_traversal<std::input_iterator_tag,boost::random_access_traversal_tag> 
1>  ] 
... 

#include <boost/range/adaptor/transformed.hpp> 
#include <boost/range/join.hpp> 
struct foo { 
    typedef int result_type; 
    result_type operator()(int x) { return x; } 
}; 
int main() { 
    using boost::adaptors::transformed; 
    int a[] = {1, 2, 3}; 
    boost::join(a | transformed(foo()), a | transformed(foo())); 
    return 0; 
} 

は、コンパイルエラーになります。

Iはboost::range_detail::demote_iterator_traversal_tagのソースコードに潜っ、それは約boost::detail::iterator_category_with_traversal適切な反復子カテゴリを推定するiterator_facadeによって使用boost::detail::facade_iterator_categoryによって生成された対価を与えるものではありませんが見つかりました。

transform_iteratoriterator_facadeに基づいているので、a | transformed(foo())の反復子カテゴリがiterator_category_with_traversal<std::input_iterator_tag,boost::random_access_traversal_tag>なると推定されていますが、demote_iterator_traversal_tagはそれを認識しません。

理由はわかりませんdemote_iterator_traversal_tagはこのように設計されています。それとも単なるバグでしょうか?

ありがとうございました。

+0

同様の投稿をメーリングリストに掲載することも考えられます。 – GManNickG

答えて

0

将来のGoogleユーザーが私のようにここにいる場合は、少なくともバージョン1.54で修正されているため、これはバグだったようです(おそらく早く、私は1.44を使ってバグし、バージョン)。

0

IteratorTraversalTag1およびIteratorTraversalTag2は、std::input_iterator_tagおよびboost::random_access_traversal_tagの両方に由来します。したがってdemote_iterator_traversal_tagBOOST_DEMOTE_TRAVERSAL_TAG(random_access_traversal_tag, random_access_traversal_tag, random_access_traversal_tag)と一致するはずです。 ::typerandom_access_traversal_tagであったはずです。これは本当にバグのようです。

関連する問題