// { dg-do assemble  }
//980519 bad error from nathan
//$ egcs -fhonor-std -nostdinc -c redef.C
//redef.C:56: redefinition of default argument for `class _Traits'

template<class _CharT> struct char_traits;
template<class _CharT> struct char_traits { };
template<> struct char_traits<char>;
template<> struct char_traits<char> { };

template<class _CharT, class _Traits = char_traits<_CharT> > class istreambuf_iterator;


template<class _CharT, class _Traits>
  class istreambuf_iterator
{
 public:
  typedef _Traits traits_type;
  class _Proxy;
 public:
  inline istreambuf_iterator() throw();
  inline istreambuf_iterator(const _Proxy& __p) throw();
};


template <class _CharT, class _Traits>
  class istreambuf_iterator<_CharT,_Traits>::_Proxy 
{
 public:
  _CharT operator*();

  //bug -g++  w/ decl "redef", no decl no prob.
  //ok -edg: no warnings
  friend class istreambuf_iterator;  //  XXX  OK?

  //bug -g++ w/ decl "redef", no decl no prob.
  //ok -edg: no warnings
  //friend class istreambuf_iterator<_CharT,_Traits>;

  //bug -g++ w/ decl "redef", no decl no prob.
  //ok -edg: declaration of "_CharT" and "_Traits" hides template parameter
  //template <class _CharT, class _Traits> friend class istreambuf_iterator; 

  //ok -g++
  //ok -edg
  //friend class istreambuf_iterator<_CharT>;

};



//explicit instantiation of a nested class
template class istreambuf_iterator<char, char_traits<char> >::_Proxy;

