有一些代码:
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)
这可能是库版本问题吗?
如果你想更明确,你也可以使用
EXPECT_TRUE(ptr != nullptr);
Run Code Online (Sandbox Code Playgroud)
(这就是我通常做的)
顺便提一句。有趣的是,在我的工作项目中,我仍然需要使用 C++98(仍在为 Sun 和 AIX 构建,尽管它很快就会消失)并且我最终在公共库中创建了我自己的NullPtrT类和NullPtr对象,这实际上是有效的使用 gtestEXPECT_EQ和EXPECT_NE宏。这样我才能做到
EXPECT_NE(NullPtr, ptr);
Run Code Online (Sandbox Code Playgroud)
我不记得我是如何完成这项工作的:)
#include "gtest.h"
using ::testing::NotNull;
ASSERT_THAT(ptr, NotNull());
Run Code Online (Sandbox Code Playgroud)
这会给你带来一些更多的描述性错误,并让你继续使用现有的框架。其他好处是与智能指针和原始指针的兼容性。
我最近在 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是您最好的选择。