首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有模板的GoogleTest

带有模板的GoogleTest
EN

Stack Overflow用户
提问于 2018-08-13 16:43:25
回答 1查看 429关注 0票数 3

希望这个问题不会太愚蠢。我是一个使用gtest的新手,我已经很长时间没有使用C++了。假设w有这个简单的模板Point类:

代码语言:javascript
复制
template <class T>
    struct Point
{
    union
    {
        T _data [2];
        struct { T x, y; };
    };
    constexpr Point(T x_, T y_) noexcept : x(x_), y(x_) {}
};

然后使用gtest,我尝试检查Point是否是默认可构造的:

代码语言:javascript
复制
TEST_P(PointTest,Concept)
{
    ASSERT_TRUE(std::is_nothrow_constructible<Point<float>,float,float>::value);
}

然后我在带有C++11标志的Clang 6.0.1中得到了这个编译错误:

代码语言:javascript
复制
"error: too many arguments provided to function-like macro invocation"

任何帮助都将受到欢迎。我知道在组合模板和googletest时必须特别小心。但是我没有想出一个解决方案。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2018-08-13 20:54:04

我认为这是C++预处理器在识别模板参数之间的逗号时出现的问题

代码语言:javascript
复制
// ...................................................v.....v
ASSERT_TRUE(std::is_nothrow_constructible<Point<float>,float,float>::value);

作为宏参数分隔符。

我建议在宏调用外部计算值。

代码语言:javascript
复制
TEST_P(PointTest,Concept)
{
   constexpr auto val 
      = std::is_nothrow_constructible<Point<float>, float, float>::value;

   ASSERT_TRUE( val );
}

或通过类型的using传递

代码语言:javascript
复制
TEST_P(PointTest ,Concept)
{
   using inc = std::is_nothrow_constructible<Point<float>, float, float>;

   ASSERT_TRUE( inc::value );
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51818382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档