在 gtest 中比较 ptr 和 nullptr
Compare ptr with nullptr in gtest
有一些代码:
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_EQ
和EXPECT_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_t
std::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
- 如何在自删除后将对象设置为nullptr
- 如何取消对nullptr的屏蔽,返回正确的对象
- C++ - "!pointer"和"pointer == nullptr"的区别?
- 将指针设置为"nullptr"并不能防止双重删除?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为什么我的节点在我设置后被设置为 nullptr = 新节点?
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 为共享 ptr 向量实现复制 c'tor?
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- wx通用目录控制错误"wxTheFileIconsTable was nullptr"
- 当设置为 const 变量时使用 nullptr
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- 在 gtest 中比较 ptr 和 nullptr