提升范围for_each、绑定、复制和back_inserter的组合失败
Combination of boost range for_each, bind, copy and a back_inserter fails
我想将a
中包含的所有整数复制到b
中。
#include <vector>
#include <iterator>
#include <boost/bind.hpp>
#include <boost/range/algorithm/for_each.hpp>
#include <boost/range/algorithm/copy.hpp>
void test()
{
std::vector<std::vector<int> > a;
std::vector<int> b;
boost::for_each(a, boost::bind(boost::copy, _1, std::back_inserter(b)));
}
它看起来很简单。我想要一个兼容 C++ 98 的衬垫。
为什么不编译?我有一长串关于boost::bind
的错误,我不明白,而且,它有好几页长。
错误以 开头:
错误 C2780: '提升::_bi::bind_t<_bi::d m_result::类型,提升::_mfi::d m,_bi::list_av_1::类型> 提升::绑定(M T::* ,A1)":预期 2 个参数 - 提供 3 个参数
这里有一个直接相关的问题:我可以使用(提升)绑定函数模板吗?该问题中的错误消息是相同的,问题的不同之处在于它们的模板函数不是库函数。
这里的诀窍是你打算绑定一个模板函数boost::copy<>()
,根据链接的问题,这是不可能的,因为模板函数必须实例化才能作为函数指针传递。此处的"绑定模板函数"部分也指出了这一点。因此,不幸的是,您需要采用相当长的构造,可以使用typedef
稍微缩短该结构(因为您在 C++98 中,因此也没有可用的decltype
):
int main()
{
typedef std::vector<int> IntVec;
std::vector<IntVec> a;
IntVec b;
boost::for_each(a,
boost::bind(boost::copy<IntVec,
std::back_insert_iterator<IntVec> >, _1, std::back_inserter(b)));
}
相关文章:
- 推导 std::vector::back() 的返回类型
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- std::vector using back(), pop_back(), push_back(), 得到'double free or corruption'错误
- C++ STL-Inserter
- vector.back()和vector.end()有什么区别
- 列表大小为 1,但 front() 和 back() 不相等
- 返回C++中没有 back() 方法的容器的最后一个元素?
- 在非空 std::list 上使用 std::list.back<int>() 时"Segmentation Fault"
- 我们可以使用Back() - 值索引在其上执行向量插入
- 当我运行以下代码添加str.front() str.back时,它给了我200个,但为什么
- 链表回推操作中需要'back pointer'
- 为什么 std::string 的 back() 应该返回对字符的引用?
- VC++ 自动说明符假定矢量的引用限定符<bool>::back的引用限定符
- C: strtok value gives back null
- vector.back() 可以用来为向量的最后一个元素赋值吗?
- 在std::vector中实现back()
- 在push_front属性上有点混淆.intlist.push_front(2 * intlist.back())会做些
- 将对象转换为 char,然后"uncasting it back"