【问题标题】:Compare ptr with nullptr in gtest比较 gtest 中的 ptr 和 nullptr
【发布时间】:2019-02-13 16:27:42
【问题描述】:

有一些代码:

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);
  • 编者注:包含&gt; 字符的错误消息在您将它们放在块引号中时呈现可怕。更好地缩进 4 个空格并呈现为代码。我会自己编辑,但移动 UI 让这变得很棘手。
  • EXPECT_TRUE(ptr); 有效。谢谢!

标签: c++ googletest


【解决方案1】:

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

EXPECT_TRUE(ptr != nullptr);

(这是我通常做的)

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

EXPECT_NE(NullPtr, ptr);

我不记得我是如何做到这一点的 :)

【讨论】:

  • 对于NullPtr(或PrintTo 重载),您可能拥有operator &lt;&lt;
【解决方案2】:

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

问题在于,对于 C++17,标准库中有一个新的重载 std::ostream::operator&lt;&lt;,它采用 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 不是一种选择,那么当一个参数是 nullptr_t 时,其他答案中提到的不使用 EXPECT_EQ/EXPECT_NE 的解决方案是您最好的选择。

【讨论】:

    【解决方案3】:
    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      相关资源
      最近更新 更多