Boost::Adaptors::Strided 在 Boost::Adaptors::Transformed 之后无法
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
看起来您希望转换采用迭代器而不是范围的值类型?
更新啊,这可能是增强范围库中的回归/更改,因为它无法编译 Live On Coliru
这意味着它确实适用于Boost 1.55,但不适用于Coliru使用的任何内容:
http://coliru.stacked-crooked.com/a/f7a2ee559e0cf008 说是1.57
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- Boost Spirit,获取迭代器内部语义动作
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 使用Boost Interprocess创建托管共享内存需要很长时间
- Boost::Adaptors::Strided 在 Boost::Adaptors::Transformed 之后无法
- 如何使用boost::adaptors:: transforms从模板化的类和向量生成范围?