3

以下は、Visual Studio 2010 でコンパイルされません。

std::vector<int> v;
for (int i = 0; i < 10; ++i) v.push_back (i);

struct TrivialTrafo {
    typedef int result_type;
    int operator () (int i) const { return 1; }
};
auto x = v | boost::adaptors::transformed (TrivialTrafo ()) 
     | boost::adaptors::strided (2);

コンパイラは不平を言います(エラーメッセージはもともとドイツ語で、私の翻訳です):

error C2664: 
'boost::range_detail::strided_iterator<BaseIterator,Category>::strided_iterator
(const boost::range_detail::strided_iterator<BaseIterator,Category> &)':
Conversion of parameter 1 from
'boost::range_detail::strided_iterator<BaseIterator,Category>' into
'const boost::range_detail::strided_iterator<BaseIterator,Category> &'
not possible 
          with
          [
BaseIterator=boost::iterators::transform_iterator<
TEST_rectnew_getRows::TrivialTrafo,std::_Vector_iterator<
std::_Vector_val<int,std::allocator<int>>>>,
Category=boost::iterators::detail::iterator_category_with_traversal<
std::input_iterator_tag,boost::iterators::random_access_traversal_tag>
          ]
          and
          [
BaseIterator=boost::iterators::transform_iterator<
TEST_rectnew_getRows::TrivialTrafo,std::_Vector_iterator<
std::_Vector_val<int,std::allocator<int>>>>,
Category=boost::iterators::random_access_traversal_tag
          ]
          and
          [              
BaseIterator=boost::iterators::transform_iterator<
TEST_rectnew_getRows::TrivialTrafo,
std::_Vector_iterator<std::_Vector_val<int,std::allocator<int>>>
>,
Category=boost::iterators::detail::iterator_category_with_traversal<
std::input_iterator_tag,boost::iterators::random_access_traversal_tag>
          ]

Boost 1.57 を使用しています。

明らかに間違ったテンプレート パラメータ値でoperator |を構築しようとしていますか?strided_rangeCategory

これはバグですか、それとも何か間違っていますか?

4

2 に答える 2

5

ええ、これは Neil Groves の書き直しのバグですstrided.hpp(1.56 以降、必要に応じてそのバージョンの boost に戻すことができます)。チケットを送信しました: https://svn.boost.org/trac/boost/ticket/10989

1 行の修正:

--- a/include/boost/range/adaptor/strided.hpp
+++ b/include/boost/range/adaptor/strided.hpp
@@ -603,7 +603,7 @@ namespace boost
         template<
             class Rng,
             class Category =
-                typename iterator_traversal<
+                typename iterators::pure_iterator_traversal<
                     typename range_iterator<Rng>::type
                 >::type
         >
于 2015-02-02T17:35:46.313 に答える
1

私はあなたが混乱していると思います。それは実際にうまく動作します:

#include <boost/range/adaptors.hpp>
#include <iostream>

struct TrivialTrafo {
    typedef int result_type;
    int operator () (int i) const { return i; }
};

int main()
{
    std::vector<int> v;
    for (int i = 0; i < 10; ++i) v.push_back (i);

    for (auto&& x : v | boost::adaptors::transformed (TrivialTrafo ()) 
        | boost::adaptors::strided (2))
    {
        std::cout << x << " ";
    }
}

版画

0 2 4 6 8 

変換が範囲の値の型ではなく反復子を取ることを期待していたように見えますか?

更新ああ、コンパイルされないため、ブースト範囲ライブラリの回帰/変更である可能性がありますLive On Coliru

これは、Boost 1.55 では動作するが、Coliru が使用するものでは動作しないことを意味します。

http://coliru.stacked-crooked.com/a/f7a2ee559e0cf008は 1.57 だと言っています

于 2015-02-02T15:48:00.983 に答える