我有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
的正确方法是什么?
答案 0 :(得分:7)
问题是,
,因为预处理器正在使用它来分隔宏参数。
使用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中引入的可能替换是:
答案 1 :(得分:6)
作为BOOST_FOREACH
的作者,我请你停止使用它。这是一个时间已经过去的黑客。请,请使用C ++ 11的基于范围的for循环,让BOOST_FOREACH
死掉。
答案 2 :(得分:4)
Boosts foreach
是宏,这意味着它由预处理器处理。并且预处理器非常简单,并且无法处理带有逗号的符号,因为它用作宏参数分隔符。