3

我有一个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

4

3 回答 3

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 中引入,有:

  • 范围循环:

    for (auto& : chosen)
    {
    }
    
  • 拉姆达斯

    std::for_each(std::begin(chosen),
                  std::end(chosen)
                  [](std::pair<int, int>& p)
                  {
                  });
    
于 2013-07-04T10:16:58.340 回答
6

作为 的作者BOOST_FOREACH,我请您停止使用它。这是一个时间来了又去的黑客。拜托,拜托,请使用 C++11 的范围基础 for 循环并让BOOST_FOREACH死。

于 2013-07-04T17:18:23.017 回答
4

Boostsforeach是一个,这意味着它由预处理器处理。预处理器非常简单,不能处理带有逗号的符号,因为它被用作宏参数分隔符。

于 2013-07-04T10:17:35.157 回答