у меня есть std::deque< std::pair<int, int> >
что я хотел бы перебрать с помощью BOOST_FOREACH
,
Я попробовал следующее:
#define foreach_ BOOST_FOREACH
// declaration of the std::deque
std::deque< std::pair<int, int> > chosen;
foreach_( std::pair<int,int> p, chosen )
{
...
}
Но когда я компилирую это (в Visual Studio), я получаю следующие ошибки:
warning C4002: too many actual parameters for macro 'BOOST_FOREACH'
1>c:\users\beeband\tests.cpp(133): error C2143: syntax error : missing ')' before '>'
1>c:\users\beeband\tests.cpp(133): error C2059: syntax error : '>'
1>c:\users\beeband\tests.cpp(133): error C2059: syntax error : ')'
1>c:\users\beeband\tests.cpp(133): error C2143: syntax error : missing ';' before '{'
1>c:\users\beeband\tests.cpp(133): error C2181: illegal else without matching if
Как правильно использовать BOOST_FOREACH
с этим deque
?
Как автор BOOST_FOREACH
Я прошу вас прекратить его использование. Это был хак, время которого пришло и ушло. Пожалуйста, пожалуйста, используйте C ++ 11 диапазон базы для циклов и пусть BOOST_FOREACH
умереть.
Проблема заключается в ,
поскольку он используется препроцессором для разделения аргументов макроса.
Возможные решения с использованием typedef
:
typedef std::pair<int, int> int_pair_t;
std::deque<int_pair_t> chosen;
foreach_( int_pair_t p, chosen )
// Or (as commented by Arne Mertz)
typedef std::deque<std::pair<int, int>> container_t;
container_t chosen;
foreach_(container_t::value_type p, chosen)
Возможные замены, оба введенные в c ++ 11:
Диапазон-для цикл:
for (auto& : chosen)
{
}
std::for_each(std::begin(chosen),
std::end(chosen)
[](std::pair<int, int>& p)
{
});
Усиливает foreach
это макрос, это означает, что он обрабатывается препроцессором. А препроцессор довольно прост и не может обрабатывать символы с запятыми в них, поскольку он используется в качестве разделителя аргументов макроса.