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 已在 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) { }
于 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 回答
0

除了发布的答案,您还可以尝试

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

这样预处理器就不会被逗号弄糊涂了。

于 2022-01-25T19:10:51.103 回答