22

Google Test のASSERT_THROW()マクロを複数のテンプレート引数と組み合わせて使用​​できません。Matrix<5,1>スローの構築を確認したいと考えてください。

ASSERT_THROW(Matrix<5,1>(), std::runtime_error);

(この例はあまり意味がありません。もちろん、これはスローされるべきではありませんが、私が持っていたものを単純化した後に残ったものです。)

MS VC++ 2008 からこの出力を取得します。

warning C4002: too many actual parameters for macro 'ASSERT_THROW'
error C2143: syntax error : missing ',' before ';'

次のものには問題はありませんが、

ASSERT_THROW(Matrix<1>(), std::runtime_error);

どうすればこの問題を克服できますか?

ありがとう!

4

4 に答える 4

21
#define COMMA ,
ASSERT_THROW(Matrix<5 COMMA 1>(), std::runtime_error);

編集: @tletnes の回答はより単純ですが、これは、マクロ パラメーターが非式として使用されている場合でも機能します。例えば:

BOOST_FOREACH(std::pair<int COMMA int>& v, myVec) { } // works
BOOST_FOREACH((std::pair<int, int>)& v, myVec) { } // fails

さらに編集:マクロ COMMA は既にブーストで定義されています:

#include <boost/preprocessor/punctuation/comma.hpp>
ASSERT_THROW(Matrix<5 BOOST_PP_COMMA() 1>(), std::runtime_error);
BOOST_FOREACH(std::pair<int BOOST_PP_COMMA() int>& v, myVec) { }
于 2010-12-21T06:55:23.153 に答える
21

問題は余分なコンマです。マクロから保護する必要があります。試す

ASSERT_THROW((Matrix<5,1>()), std::runtime_error);
于 2010-12-21T06:56:14.717 に答える
9

#define COMMA、GCCでコンパイルできない場合があります。代わりに、#define COMMA()を使用してください。他の人の投稿にコメントを追加できないのはなぜですか?

于 2010-12-21T07:53:40.290 に答える