template <class> struct char_traits;
template <typename, typename> class basic_ostream;
template <typename> class basic_string {
public:
  ~basic_string();
};

template <typename _CharT, typename _Traits, typename _Alloc>
void operator<<(basic_ostream<_CharT, _Traits>, basic_string<_Alloc>);
class locale {
public:
  ~locale();
};
enum _Ios_Openmode { _S_out };
class A {};
class B {
public:
  void m_fn1(locale);
  void m_fn2(A *);
  typedef _Ios_Openmode openmode;
  locale _M_ios_locale;
  void m_fn3();
};
template <typename, typename> class basic_ostream : public B {};

class C : public A {
public:
  basic_string<int> _M_string;
  C(B::openmode);
};
class D : public basic_ostream<wchar_t, char_traits<wchar_t>> {
  C _M_stringbuf;

public:
  D() : _M_stringbuf(_S_out) { m_fn2(&_M_stringbuf); }
  basic_string<int> m_fn4();
};

template <typename _Tp, typename _CharT, class _Traits>
basic_ostream<_CharT, _Traits> &operator<<(basic_ostream<_CharT, _Traits> &p1,
                                           _Tp) {
  locale a;
  D b;
  p1.m_fn3();
  b.m_fn1(a);
  p1 << b.m_fn4();
}

template basic_ostream<wchar_t, char_traits<wchar_t>> &
operator<<(basic_ostream<wchar_t, char_traits<wchar_t>> &, double);
