namespace std {
template<class charT> class char_traits;
template<> class char_traits<char>;
template<> class char_traits<char16_t>;
template<> class char_traits<char32_t>;
template<> class char_traits<wchar_t>;
template<class T> class allocator;
template <class charT, class traits = char_traits<charT>>
class basic_ios;
template <class charT, class traits = char_traits<charT>>
class basic_streambuf;
template <class charT, class traits = char_traits<charT>>
class basic_istream;
template <class charT, class traits = char_traits<charT>>
class basic_ostream;
template <class charT, class traits = char_traits<charT>>
class basic_iostream;
template <class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT>>
class basic_stringbuf;
template <class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT>>
class basic_istringstream;
template <class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT>>
class basic_ostringstream;
template <class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT>>
class basic_stringstream;
template <class charT, class traits = char_traits<charT>>
class basic_filebuf;
template <class charT, class traits = char_traits<charT>>
class basic_ifstream;
template <class charT, class traits = char_traits<charT>>
class basic_ofstream;
template <class charT, class traits = char_traits<charT>>
class basic_fstream;
template <class charT, class traits = char_traits<charT>>
class istreambuf_iterator;
template <class charT, class traits = char_traits<charT>>
class ostreambuf_iterator;
using ios = basic_ios<char>;
using wios = basic_ios<wchar_t>;
using streambuf = basic_streambuf<char>;
using istream = basic_istream<char>;
using ostream = basic_ostream<char>;
using iostream = basic_iostream<char>;
using stringbuf = basic_stringbuf<char>;
using istringstream = basic_istringstream<char>;
using ostringstream = basic_ostringstream<char>;
using stringstream = basic_stringstream<char>;
using filebuf = basic_filebuf<char>;
using ifstream = basic_ifstream<char>;
using ofstream = basic_ofstream<char>;
using fstream = basic_fstream<char>;
using wstreambuf = basic_streambuf<wchar_t>;
using wistream = basic_istream<wchar_t>;
using wostream = basic_ostream<wchar_t>;
using wiostream = basic_iostream<wchar_t>;
using wstringbuf = basic_stringbuf<wchar_t>;
using wistringstream = basic_istringstream<wchar_t>;
using wostringstream = basic_ostringstream<wchar_t>;
using wstringstream = basic_stringstream<wchar_t>;
using wfilebuf = basic_filebuf<wchar_t>;
using wifstream = basic_ifstream<wchar_t>;
using wofstream = basic_ofstream<wchar_t>;
using wfstream = basic_fstream<wchar_t>;
template <class state> class fpos;
using streampos = fpos<char_traits<char>::state_type>;
using wstreampos = fpos<char_traits<wchar_t>::state_type>;
}
Default template arguments are described as appearing both in <iosfwd> and in the synopsis of other headers but it is well-formed to include both <iosfwd> and one or more of the other headers.290
[ Note: The class template specialization basic_ios<charT, traits> serves as a virtual base class for the class templates basic_istream, basic_ostream, and class templates derived from them. basic_iostream is a class template derived from both basic_istream<charT, traits> and basic_ostream<charT, traits>.
The class template specialization basic_streambuf<charT, traits> serves as a base class for class templates basic_stringbuf and basic_filebuf.
The class template specialization basic_istream<charT, traits> serves as a base class for class templates basic_istringstream and basic_ifstream.
The class template specialization basic_ostream<charT, traits> serves as a base class for class templates basic_ostringstream and basic_ofstream.
The class template specialization basic_iostream<charT, traits> serves as a base class for class templates basic_stringstream and basic_fstream.
Other typedef-names define instances of class templates specialized for char or wchar_t types.
Specializations of the class template fpos are used for specifying file position information.
The types streampos and wstreampos are used for positioning streams specialized on char and wchar_t respectively.
This synopsis suggests a circularity between streampos and char_traits<char>. An implementation can avoid this circularity by substituting equivalent types. One way to do this might be
template<class stateT> class fpos { ... }; // depends on nothing
using _STATE = ... ; // implementation private declaration of stateT
using streampos = fpos<_STATE>;
template<> struct char_traits<char> {
using pos_type = streampos;
}
— end note ]
It is the implementation's responsibility to implement headers so that including <iosfwd> and other headers does not violate the rules about multiple occurrences of default arguments.