2016-02-24 1 views
1

Я хочу скопировать все целые числа, содержащиеся в a, в b.Комбинация диапазона повышения для for_each, bind, copy и back_inserter не работает

#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: тип «повышение :: _ би :: bind_t < _bi :: dm_result :: тип, форсирует :: _ ммк :: дм, _bi :: list_av_1 :: > boost :: bind (MT :: *, A1) ': ожидает 2 аргумента - 3 предоставлено

+0

Уточнитните «не работает», авария? не компилируется? если у вас есть сообщение об ошибке, пожалуйста, сообщите об этом. – Borgleader

+1

Это не работает, потому что в нем есть «некоторая ошибка». Если вы более конкретно, вы не получите лучшего ответа. – SergeyA

+0

К сожалению, добавлена ​​дополнительная информация – lars

ответ

1

Здесь непосредственно связан вопрос: Can I use (boost) bind with a function template?. Сообщение об ошибке в этом вопросе идентично, и проблема отличается тем, что их функция шаблона не является библиотечной.

Фокус в том, что вы намерены связать функцию шаблона boost::copy<>(), которая в соответствии с связанным вопросом невозможна, потому что функция шаблона должна быть создана для передачи в качестве указателя функции. Это также указано here, раздел «Привязка функции шаблона». Так, к сожалению, вам придется прибегнуть к довольно длинной конструкции, которая может быть слегка укороченной с использованием 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))); 
} 
Смежные вопросы