在gtest中将ptr与nullptr进行比较

时间:2019-02-13 16:27:43

标签: c++ googletest

有一些代码:

--force

然后出现以下编译错误:

EXPECT_NE(nullptr,ptr);

这可能是库版本问题吗?

3 个答案:

答案 0 :(得分:2)

我最近在使用GTest 1.8.0时遇到了相同的问题,但仅在以C ++ 17模式使用Visual Studio 2019时才遇到。 Visual Studio 2019在C ++ 14模式下可以正常工作,而Clang和GCC似乎都在C ++ 17模式下没有相同的问题。

问题在于,在C ++ 17中,std::ostream::operator<<的标准库中有一个新的重载,它需要一个nullptr_t,但是GTest也提供了自己的重载,因此您的编译器不知道哪个一个使用。

如果您完全控制自己的GTest版本,那么https://github.com/google/googletest/pull/1620/commits/f66ab00704cd47e4e63ef6d425ca14b9192aaebb是GTest-1.8.0的一项更改,它可以解决此问题:它不像删除重载那样简单,因为相关的函数是模板其其他实例化仍在使用。相反,解决方案是定义一个显式的void PrintTo(std::nullptr_t, ::std::ostream* os)函数,该函数随后将自动使用,而不再依赖于模棱两可的重载。

如果不能选择修改GTest,则最好的选择是其他答案中提到的解决方案,即当一个参数为EXPECT_EQ时不使用EXPECT_NE / nullptr_t

答案 1 :(得分:1)

namespace {
  template<class T>
  auto not_nullptr(T*p) -> testing::AssertionResult
  {
    if (p)
      return testing::AssertionSuccess();
    else
      return testing::AssertionFailure() << "pointer is null";
  }
}

...

EXPECT_TRUE(not_nullptr(ptr));

参考:

https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#using-a-function-that-returns-an-assertionresult

答案 2 :(得分:1)

如果您想更加明确,也可以使用

EXPECT_TRUE(ptr != nullptr);

(我通常就是这样做的)

顺便说一句。有趣的是,在我的工作项目中,我仍然必须使用C ++ 98(仍将为Sun和AIX构建,尽管很快就会消失),最后我创建了自己的NullPtrT类和{{1} }对象,该对象实际上与gtest NullPtrEXPECT_EQ宏一起使用。这样我就可以

EXPECT_NE

我不记得我是如何完成这项工作的:)