在 gtest 中比较 ptr 和 nullptr

Иго*_*чев 9 c++ googletest

有一些代码:

EXPECT_NE(nullptr,ptr);
Run Code Online (Sandbox Code Playgroud)

我收到以下编译错误:

'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 &)'
Run Code Online (Sandbox Code Playgroud)

这可能是库版本问题吗?

axa*_*lis 8

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

EXPECT_TRUE(ptr != nullptr);
Run Code Online (Sandbox Code Playgroud)

(这就是我通常做的)

顺便提一句。有趣的是,在我的工作项目中,我仍然需要使用 C++98(仍在为 Sun 和 AIX 构建,尽管它很快就会消失)并且我最终在公共库中创建了我自己的NullPtrT类和NullPtr对象,这实际上是有效的使用 gtestEXPECT_EQEXPECT_NE宏。这样我才能做到

EXPECT_NE(NullPtr, ptr);
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*vis 6

#include "gtest.h"

using ::testing::NotNull;

ASSERT_THAT(ptr, NotNull());
Run Code Online (Sandbox Code Playgroud)

这会给你带来一些更多的描述性错误,并让你继续使用现有的框架。其他好处是与智能指针和原始指针的兼容性。

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


Dre*_*mer 5

我最近在 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当一个参数是 a 的解决方案nullptr_t是您最好的选择。