On Thu, Nov 08, 2007 at 10:31:02PM +0100, Andre Poenitz wrote: > On Thu, Nov 08, 2007 at 10:10:48PM +0100, Enrico Forestieri wrote: > > [...] > > > The Standard says how basic_istream<> etc should be defined. It does not > > > mandate that #include <iosfwd> is the only way to get it. Doing it 'by > > > hand' is as legal even if less convienient than the #include. > > > > Then do it, by all means. > > I am currently compiling with the attached changes. Would be nice if you > could verify that it would work for you as well.
The attached patch works for me. Abdel, if you confirm that it also works with MSVC I will commit it. -- Enrico
Index: src/support/strfwd.h =================================================================== --- src/support/strfwd.h (revision 21527) +++ src/support/strfwd.h (working copy) @@ -1,14 +1,14 @@ // -*- C++ -*- -/** - * \file strfwd.h - * This file is part of LyX, the document processor. - * Licence details can be found in the file COPYING. - * - * \author André Pönitz - * \author Enrico Forestieri - * - * Full author contact details are available in file CREDITS. - */ + +// Heavily inspired by /usr/include/c++/4.1/bits +// +// Copyright (C) 2001, 2002 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. #ifndef STRFWD_H #define STRFWD_H @@ -28,17 +28,28 @@ namespace lyx { typedef boost::uint32_t #endif -#include <iosfwd> -// We have to forward declare the string type as not all compilers -// do that in the iosfwd header. -namespace std -{ +namespace std { + +template<typename Alloc> class allocator; + +template<typename Char> struct char_traits; +template<> struct char_traits<char>; +#ifdef USE_WCHAR_T +template<> struct char_traits<wchar_t>; +#endif template<typename Char, typename Traits, typename Alloc> class basic_string; typedef basic_string<char, char_traits<char>, allocator<char> > string; -} +template<class Char, class Traits> class basic_istream; +template<class Char, class Traits> class basic_ostream; + +typedef basic_istream<char, char_traits<char> > istream; +typedef basic_ostream<char, char_traits<char> > ostream; + +} // namepace std + namespace lyx { @@ -47,10 +58,10 @@ typedef std::basic_string<char_type, std std::allocator<char_type> > docstring; /// Base class for UCS4 input streams -typedef std::basic_istream<char_type> idocstream; +typedef std::basic_istream<char_type, std::char_traits<char_type> > idocstream; /// Base class for UCS4 output streams -typedef std::basic_ostream<char_type> odocstream; +typedef std::basic_ostream<char_type, std::char_traits<char_type> > odocstream; #if ! defined(USE_WCHAR_T) extern odocstream & operator<<(odocstream &, char);