提升范围for_each、绑定、复制和back_inserter的组合失败

Combination of boost range for_each, bind, copy and a back_inserter fails

本文关键字:inserter back 失败 组合 绑定 范围 for each 复制      更新时间:2023-10-16

我想将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)));
}