<iosfwd> & typedefs with incomplete types.

  • Thread starter Steven T. Hatton
  • Start date
S

Steven T. Hatton

I copied what I believe is a complete representation of <iosfwd> from
ISO/IEC 14882:2003(E). My understanding of the rules covering typedefs,
templates and forward declarations is not very solid. As I understand
what is presented here, the typedefs are declaring typedef-names which
refer to incomplete types. That is to say, they are becoming synonyms
for forward declarations of class template instances. I see nothing in
the Standard suggesting this is not legal. Is it?

I have been told with great conviction that there are some circular
dependencies involved in bootstrapping the I/O system. On of them,
IIRC, involves where char_traits<> is defined. Is anybody familiar
with this complication? Perhaps this is what is addressed in the note
near the end below?


#ifndef IOSFWD
#define IOSFWD

namespace std {
// page 607 footnote:
// 263) It is the implementation?s responsibility to implement headers so that
// including <iosfwd> and other headers does not violate the rules about multiple
// occurences of default arguments.


template<class charT> class char_traits;
template<> class char_traits<char>;
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;
typedef basic_ios<char> ios;
typedef basic_ios<wchar_t> wios;
typedef basic_streambuf<char> streambuf;
typedef basic_istream<char> istream;
typedef basic_ostream<char> ostream;
typedef basic_iostream<char> iostream;
typedef basic_stringbuf<char> stringbuf;
typedef basic_istringstream<char> istringstream;
typedef basic_ostringstream<char> ostringstream;
typedef basic_stringstream<char> stringstream;
typedef basic_filebuf<char> filebuf;
typedef basic_ifstream<char> ifstream;
typedef basic_ofstream<char> ofstream;
typedef basic_fstream<char> fstream;
typedef basic_streambuf<wchar_t> wstreambuf;
typedef basic_istream<wchar_t> wistream;
typedef basic_ostream<wchar_t> wostream;
typedef basic_iostream<wchar_t> wiostream;
typedef basic_stringbuf<wchar_t> wstringbuf;
typedef basic_istringstream<wchar_t> wistringstream;
typedef basic_ostringstream<wchar_t> wostringstream;
typedef basic_stringstream<wchar_t> wstringstream;
typedef basic_filebuf<wchar_t> wfilebuf;
typedef basic_ifstream<wchar_t> wifstream;
typedef basic_ofstream<wchar_t> wofstream;
typedef basic_fstream<wchar_t> wfstream;
template <class state> class fpos;
typedef fpos<char_traits<char>::state_type> streampos;
typedef fpos<char_traits<wchar_t>::state_type> wstreampos;

/*
This synopsis suggests a circularity between streampos and char_traits<char>. An implementa-
tion can avoid this circularity by substituting equivalent types. One way to do this might be

template<class stateT> class fpos { ... };// depends on nothing
typedef ... _STATE; // implementation private declaration of stateT
typedef fpos<_STATE> streampos;
template<> struct char_traits<char> {
typedef streampos
pos_type;
// ...
}
*/

}

#endif
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,534
Members
45,008
Latest member
Rahul737

Latest Threads

Top