By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
448,571 Members | 1,268 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 448,571 IT Pros & Developers. It's quick & easy.

<iosfwd> & typedefs with incomplete types.

P: n/a
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
--
Use the Source Luke.
Jul 23 '05 #1
Share this question for a faster answer!
Share on Google+

This discussion thread is closed

Replies have been disabled for this discussion.