具有一些代码:
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构建,尽管很快就会消失),最终我在C ++ 98中创建了自己的NullPtrT
类和NullPtr
对象。公共库,实际上可与gtest EXPECT_EQ
和EXPECT_NE
宏一起使用。这样我就可以做到
EXPECT_NE(NullPtr, ptr);
我不记得我是如何完成这项工作的:)
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));
参考:
我最近在使用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
是最好的选择。