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 で導入された代替案は次のとおりです。

  • range-forループ:

    for (auto& : chosen)
    {
    }
    
  • ラムダ:

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

Boostsforeachマクロです。つまり、プリプロセッサによって処理されます。また、プリプロセッサは非常に単純で、マクロ引数セパレータとして使用されるため、コンマを含むシンボルを処理できません。

于 2013-07-04T10:17:35.157 に答える