簡體   English   中英

在boost :: adapters :: transformed之后,不能使用boost :: adapters :: strided嗎?

[英]boost::adaptors::strided cannot be used after boost::adaptors::transformed?

以下內容無法在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 | 嘗試使用錯誤的Category模板參數值構造strided_range

這是一個錯誤,還是我做錯了什么?

是的,這是Neil Groves重寫strided.hpp的一個錯誤(從1.56開始,如果你需要,你可以恢復到那個版本的boost)。 我已經提交了一張票: https//svn.boost.org/trac/boost/ticket/10989

單線修復:

--- 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
         >

我覺得你很困惑。 它實際上工作正常:

#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 

看起來你期望轉換采用迭代器而不是范圍的值類型?

更新啊,它可能是Boost Range庫中的回歸/更改,因為它不能編譯Live On Coliru

這意味着它可以與Boost 1.55一起使用,但不適用於Coliru使用的任何內容:

http://coliru.stacked-crooked.com/a/f7a2ee559e0cf008說這是1.57

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM