比较ptr与gtest中的nullptr

问题描述 投票:1回答:3

具有一些代码:

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 &)'

这可能是库版本问题吗?

c++ googletest
3个回答
1
投票

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

EXPECT_TRUE(ptr != nullptr);

(我通常这样做)

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

EXPECT_NE(NullPtr, ptr);

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


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));

参考:

https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#using-a-function-that-returns-an-assertionresult


1
投票

我最近在使用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是最好的选择。

© www.soinside.com 2019 - 2024. All rights reserved.