Ответ 1
проблема заключается в дополнительной запятой, вам нужно будет защитить ее от макроса. Попробуйте
ASSERT_THROW((Matrix<5,1>()), std::runtime_error);
Я не могу использовать макрос Google Test ASSERT_THROW()
в сочетании с несколькими аргументами шаблона. Подумайте, что я хочу, чтобы конструкция Matrix<5,1>
выбрала:
ASSERT_THROW(Matrix<5,1>(), std::runtime_error);
(этот пример не имеет большого смысла, конечно, это не бросать, но это то, что осталось после упрощения того, что у меня было.)
Я получаю этот вывод от MS VС++ 2008:
warning C4002: too many actual parameters for macro 'ASSERT_THROW'
error C2143: syntax error : missing ',' before ';'
В то время как нет проблем с:
ASSERT_THROW(Matrix<1>(), std::runtime_error);
Как я могу решить эту проблему?
Спасибо!
проблема заключается в дополнительной запятой, вам нужно будет защитить ее от макроса. Попробуйте
ASSERT_THROW((Matrix<5,1>()), std::runtime_error);
#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 уже определен в boost:
#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 COMMA, не может компилироваться в GCC. Вместо этого используйте #define COMMA(). Почему я не могу добавить комментарий к другому сообщению?