Fixes the "ambiguous overload" compiler error when a mock function takes an argument that supports streaming to basic_ostream<C, T>.
This commit is contained in:
parent
e1cdce5f76
commit
2f0849fef4
|
@ -116,8 +116,19 @@ class TypeWithoutFormatter<T, true> {
|
||||||
// to simplify the implementation, as much code in 'internal' needs to
|
// to simplify the implementation, as much code in 'internal' needs to
|
||||||
// use << in STL, which would conflict with our own << were it defined
|
// use << in STL, which would conflict with our own << were it defined
|
||||||
// in 'internal'.
|
// in 'internal'.
|
||||||
template <typename T>
|
//
|
||||||
::std::ostream& operator<<(::std::ostream& os, const T& x) {
|
// Note that this operator<< takes a generic std::basic_ostream<Char,
|
||||||
|
// CharTraits> type instead of the more restricted std::ostream. If
|
||||||
|
// we define it to take an std::ostream instead, we'll get an
|
||||||
|
// "ambiguous overloads" compiler error when trying to print a type
|
||||||
|
// Foo that supports streaming to std::basic_ostream<Char,
|
||||||
|
// CharTraits>, as the compiler cannot tell whether
|
||||||
|
// operator<<(std::ostream&, const T&) or
|
||||||
|
// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
|
||||||
|
// specific.
|
||||||
|
template <typename Char, typename CharTraits, typename T>
|
||||||
|
::std::basic_ostream<Char, CharTraits>& operator<<(
|
||||||
|
::std::basic_ostream<Char, CharTraits>& os, const T& x) {
|
||||||
TypeWithoutFormatter<T, ::testing::internal::IsAProtocolMessage<T>::value>::
|
TypeWithoutFormatter<T, ::testing::internal::IsAProtocolMessage<T>::value>::
|
||||||
PrintValue(x, &os);
|
PrintValue(x, &os);
|
||||||
return os;
|
return os;
|
||||||
|
|
|
@ -597,6 +597,64 @@ TEST(PrintWideStringTest, StringInStdNamespace) {
|
||||||
}
|
}
|
||||||
#endif // GTEST_HAS_STD_WSTRING
|
#endif // GTEST_HAS_STD_WSTRING
|
||||||
|
|
||||||
|
// Tests printing types that support generic streaming (i.e. streaming
|
||||||
|
// to std::basic_ostream<Char, CharTraits> for any valid Char and
|
||||||
|
// CharTraits types).
|
||||||
|
|
||||||
|
// Tests printing a non-template type that supports generic streaming.
|
||||||
|
|
||||||
|
class AllowsGenericStreaming {};
|
||||||
|
|
||||||
|
template <typename Char, typename CharTraits>
|
||||||
|
std::basic_ostream<Char, CharTraits>& operator<<(
|
||||||
|
std::basic_ostream<Char, CharTraits>& os,
|
||||||
|
const AllowsGenericStreaming& a) {
|
||||||
|
return os << "AllowsGenericStreaming";
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(PrintTypeWithGenericStreamingTest, NonTemplateType) {
|
||||||
|
AllowsGenericStreaming a;
|
||||||
|
EXPECT_EQ("AllowsGenericStreaming", Print(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests printing a template type that supports generic streaming.
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class AllowsGenericStreamingTemplate {};
|
||||||
|
|
||||||
|
template <typename Char, typename CharTraits, typename T>
|
||||||
|
std::basic_ostream<Char, CharTraits>& operator<<(
|
||||||
|
std::basic_ostream<Char, CharTraits>& os,
|
||||||
|
const AllowsGenericStreamingTemplate<T>& a) {
|
||||||
|
return os << "AllowsGenericStreamingTemplate";
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(PrintTypeWithGenericStreamingTest, TemplateType) {
|
||||||
|
AllowsGenericStreamingTemplate<int> a;
|
||||||
|
EXPECT_EQ("AllowsGenericStreamingTemplate", Print(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests printing a type that supports generic streaming and can be
|
||||||
|
// implicitly converted to another printable type.
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class AllowsGenericStreamingAndImplicitConversionTemplate {
|
||||||
|
public:
|
||||||
|
operator bool() const { return false; }
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Char, typename CharTraits, typename T>
|
||||||
|
std::basic_ostream<Char, CharTraits>& operator<<(
|
||||||
|
std::basic_ostream<Char, CharTraits>& os,
|
||||||
|
const AllowsGenericStreamingAndImplicitConversionTemplate<T>& a) {
|
||||||
|
return os << "AllowsGenericStreamingAndImplicitConversionTemplate";
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(PrintTypeWithGenericStreamingTest, TypeImplicitlyConvertible) {
|
||||||
|
AllowsGenericStreamingAndImplicitConversionTemplate<int> a;
|
||||||
|
EXPECT_EQ("AllowsGenericStreamingAndImplicitConversionTemplate", Print(a));
|
||||||
|
}
|
||||||
|
|
||||||
// Tests printing STL containers.
|
// Tests printing STL containers.
|
||||||
|
|
||||||
TEST(PrintStlContainerTest, EmptyDeque) {
|
TEST(PrintStlContainerTest, EmptyDeque) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user