[英]boost::adaptors::transformed followed by boost::adaptors::filtered calls function twice
[英]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使用的任何內容:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.