我无法将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);
我该如何克服这个问题?
谢谢!
答案 0 :(得分:19)
#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) { }
答案 1 :(得分:19)
问题是额外的逗号,你需要保护它免受宏的影响。试试
ASSERT_THROW((Matrix<5,1>()), std::runtime_error);
答案 2 :(得分:7)
#define COMMA,可能无法在GCC中编译。 请改用#define COMMA()。 为什么我不能在其他帖子上添加评论?