Domanda

Non sono in grado di utilizzare macro ASSERT_THROW() di Google prova in combinazione con più argomenti di template. Si consideri che voglio fare in modo che la costruzione di Matrix<5,1> getta:

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

(questo esempio non ha molto senso, naturalmente questo Shoud non buttare, ma è ciò che rimase dopo semplificando quello che avevo.)

ottengo questo output da MS VC ++ 2008:

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

considerando che non ci sono problemi con:

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

Come posso superare questo problema?

Grazie!

È stato utile?

Soluzione

il problema è la virgola in più, sarà necessario proteggerla dalla macro. Prova

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

Altri suggerimenti

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

Modifica @tletnes risposta è più semplice, tuttavia questo funziona anche se la macro parametro utilizzato come un non-espressione. Ad esempio:

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

Più edit: La macro virgola è già definito in spinta:

#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) { }

#define virgola, non può compilare in GCC. Utilizzare #define VIRGOLA (), invece. Perché non riesco ad aggiungere commentato il post di altri?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top