在 gtest 中比较 ptr 和 nullptr

Compare ptr with nullptr in gtest

本文关键字:nullptr ptr 比较 gtest      更新时间:2023-10-16

有一些代码:

EXPECT_NE(nullptr,ptr);

我收到以下编译错误:

'operator <<' is ambiguous
could be 'std::basic_ostream<char,std::char_traits<char>> &std::basic_ostream<char,std::char_traits<char>>::operator <<<void>(std::nullptr_t)'
or       'std::basic_ostream<char,std::char_traits<char>> &testing::internal2::operator <<<char,std::char_traits<char>,T>(std::basic_ostream<char,std::char_traits<char>> &,const T &)'

这可能是库版本问题吗?

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

EXPECT_TRUE(ptr != nullptr);

(这是我通常所做的)

顺便说一句,有趣的是,在我的工作项目中,我仍然必须使用 C++98(仍在为 Sun 和 AIX 构建,尽管它很快就会消失),我最终在公共库中创建了自己的NullPtrT类和NullPtr对象,它实际上适用于 gtestEXPECT_EQEXPECT_NE宏。这样我就可以做

EXPECT_NE(NullPtr, ptr);

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

我最近在GTest 1.8.0中遇到了同样的问题,但只有在C++17模式下使用Visual Studio 2019时。Visual Studio 2019在C++14模式下运行良好,Clang和GCC在C++17模式下似乎都没有同样的问题。

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

如果您完全控制您的 GTest 版本,那么 https://github.com/google/googletest/pull/1620/commits/f66ab00704cd47e4e63ef6d425ca14b9192aaebb GTest-1.8.0 的更改可以解决此问题:这并不像删除重载那么容易,因为有问题的函数是一个模板,其其他实例仍在使用。相反,解决方案是定义一个显式void PrintTo(std::nullptr_t, ::std::ostream* os)函数,然后将自动使用该函数,不再服从不明确的重载。

当修改GTest不是一种选择时,当一个参数是nullptr_t时,其他答案中提到的不使用EXPECT_EQ/EXPECT_NE的解决方案是您最好的选择。

#include "gtest.h"
using ::testing::NotNull;
ASSERT_THAT(ptr, NotNull());

这将为您提供一些更具描述性的错误,并使您继续使用现有框架。 其他好处是与智能指针和原始指针兼容。

其他匹配器可以在 gtest 匹配器文档中找到。

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/docs/advanced.md#using-a-function-that-returns-an-assertionresult

Google 测试文档说,

将指针与NULL进行比较时,请使用EXPECT_EQ(ptr, nullptr)而不是EXPECT_EQ(ptr, NULL)

将指针与NULL进行比较时,请使用EXPECT_NE(ptr, nullptr)而不是EXPECT_NE(ptr, NULL)

因此,您可以只使用EXPECT_NE(ptr, nullptr);.

阅读更多:https://google.github.io/googletest/reference/assertions.html#EXPECT_NE