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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user