有一些代码:
--force
然后出现以下编译错误:
EXPECT_NE(nullptr,ptr);
这可能是库版本问题吗?
答案 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));
参考:
答案 2 :(得分:1)
如果您想更加明确,也可以使用
EXPECT_TRUE(ptr != nullptr);
(我通常就是这样做的)
顺便说一句。有趣的是,在我的工作项目中,我仍然必须使用C ++ 98(仍将为Sun和AIX构建,尽管很快就会消失),最后我创建了自己的NullPtrT
类和{{1} }对象,该对象实际上与gtest NullPtr
和EXPECT_EQ
宏一起使用。这样我就可以
EXPECT_NE
我不记得我是如何完成这项工作的:)