http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60711
--- Comment #5 from Jim Michaels <jmichae3 at yahoo dot com> --- not allowed to use a basic_streambuf there either, also says it's protected. apparently ostream() is protected. I looked, and there is a place that looks like you can use a treambuf, but I am unable to get it to work. ostream line 384 where it says protected: basic_ostream() { this->init(0); } template<typename _ValueT> __ostream_type& _M_insert(_ValueT __v); }; is where it complains. tried typedef std::basic_ostream<std::basic_streambuf<char16_t, std::char_traits<char16_t> > > uostream; and got f:\x86_64-4.9.0-snapshot-20140219-rev207854-win32-sjlj-rt_v4\mingw64\x86_64-w64-mingw32\include\c++\ostream:384:7: error: 'std::basic_ostream<_CharT, _Traits>:: basic_ostream() [with _CharT = std::basic_streambuf<char32_t, std::char_traits<char32_t> >; _Traits = std::char_traits<std::basic_streambuf<char32_t, std::char_ traits<char32_t> > >]' is protected basic_ostream() ^ ostream2a.cpp:21:12: error: within this context u32ostream u32cout; ^ and a whole bunch of other errors. I had thought you could simply use the template <class charT, class traits = char_traits<charT> > class basic_ostream; based definition to create a new a type to instantiate a u16cout or ucout, but apparently this is not so because of the protected-ness of the method. there is probably a reason for this, I know of no workaround yet.