<iosfwd> & typedefs with incomplete types.

Discussion in 'C++' started by Steven T. Hatton, Jul 7, 2005.

  1. 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.
     
    Steven T. Hatton, Jul 7, 2005
    #1
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    1
    Views:
    364
  2. Paul F. Dietz

    Question about incomplete array element types

    Paul F. Dietz, Jul 11, 2003, in forum: C Programming
    Replies:
    5
    Views:
    464
    Dan Pop
    Jul 11, 2003
  3. Mantorok Redgormor

    lvalues -> incomplete types

    Mantorok Redgormor, Feb 6, 2004, in forum: C Programming
    Replies:
    7
    Views:
    435
  4. Michael Birkmose

    pointer to incomplete types

    Michael Birkmose, May 14, 2004, in forum: C Programming
    Replies:
    7
    Views:
    743
    Dave Thompson
    May 27, 2004
  5. , India
    Replies:
    3
    Views:
    2,915
    James Kanze
    Nov 13, 2010
Loading...

Share This Page