<!--
    Licensed to the Apache Software  Foundation (ASF) under one or more
    contributor  license agreements.  See  the NOTICE  file distributed
    with  this  work  for  additional information  regarding  copyright
    ownership.   The ASF  licenses this  file to  you under  the Apache
    License, Version  2.0 (the  License); you may  not use  this file
    except in  compliance with the License.   You may obtain  a copy of
    the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the  License is distributed on an  "AS IS" BASIS,
    WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
    implied.   See  the License  for  the  specific language  governing
    permissions and limitations under the License.

    Copyright 1999-2007 Rogue Wave Software, Inc.
-->

<HTML>
<HEAD>
<TITLE>&lt;sstream&gt;</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="sort-heap.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="stable-partition.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library Reference Guide</B></DIV>
<H2>&lt;sstream&gt;</H2>
<P><B>Library:</B>&nbsp;&nbsp;<A HREF="2-11.html">Input/output</A></P>

<PRE><HR><B><I>Header</I></B><HR></PRE>

<UL>
<LI><A HREF="#sec1">Local Index</A></LI>
<LI><A HREF="#sec2">Summary</A></LI>
<LI><A HREF="#sec3">Synopsis</A></LI>
<LI><A HREF="#sec4">See Also</A></LI>
<LI><A HREF="#sec5">Standards Conformance</A></LI>
</UL>
<A NAME="sec1"><H3>Local Index</H3></A>
No Entries
<A NAME="sec2"><H3>Summary</H3></A>
<P>The header <SAMP>&lt;sstream&gt;</SAMP> is part of the Input/output library of the C++ Standard Library. It defines the class templates <B><I><A HREF="basic-stringbuf.html">basic_stringbuf</A></I></B>, <B><I><A HREF="basic-istringstream.html">basic_istringstream</A></I></B>, <B><I><A HREF="basic-ostringstream.html">basic_ostringstream</A></I></B>, and <B><I><A HREF="basic-stringstream.html">basic_stringstream</A></I></B>, and the types <B><I><A HREF="basic-stringbuf.html">stringbuf</A></I></B>, <B><I>wstringbuf</I></B>, <B><I><A HREF="basic-istringstream.html">istringstream</A></I></B>, <B><I>wistringstream</I></B>, <B><I><A HREF="basic-ostringstream.html">ostringstream</A></I></B>, <B><I>wostringstream</I></B>, <B><I><A HREF="basic-stringstream.html">stringstream</A></I></B>, and <B><I>wstringstream</I></B> as aliases for specializations of the class template on <SAMP>char</SAMP> and <SAMP>wchar_t</SAMP>.</P>
<A NAME="sec3"><H3>Synopsis</H3></A>

<PRE>namespace std {
  template &lt;class charT, class traits = char_traits&lt;charT&gt;, 
            class Allocator = allocator&lt;charT&gt; &gt;
  class <SAMP><A HREF="basic-stringbuf.html">basic_stringbuf</A></SAMP>;

  typedef basic_stringbuf&lt;char&gt; stringbuf;
  typedef basic_stringbuf&lt;wchar_t&gt; wstringbuf;

  template&lt;class charT, class traits = char_traits&lt;charT&gt;, 
           class Allocator = allocator&lt;charT&gt; &gt;
  class <SAMP><A HREF="basic-istringstream.html">basic_istringstream</A></SAMP>;

  typedef basic_istringstream&lt;char&gt; istringstream;
  typedef basic_istringstream&lt;wchar_t&gt; wistringstream;

  template &lt;class charT, class traits = char_traits&lt;charT&gt;, 
            class Allocator = allocator&lt;charT&gt; &gt;
  class <SAMP><A HREF="basic-ostringstream.html">basic_ostringstream</A></SAMP>;
  typedef basic_ostringstream&lt;char&gt; ostringstream;
  typedef basic_ostringstream&lt;wchar_t&gt; wostringstream;

  template &lt;class charT, class traits = char_traits&lt;charT&gt;, 
            class Allocator = allocator&lt;charT&gt; &gt;
  class <SAMP><A HREF="basic-stringstream.html">basic_stringstream</A></SAMP>;
  typedef basic_stringstream&lt;char&gt; stringstream;
  typedef basic_stringstream&lt;wchar_t&gt; wstringstream;
}
</PRE>
<A NAME="sec4"><H3>See Also</H3></A>
<P><B><I><A HREF="basic-stringbuf.html">basic_stringbuf</A></I></B>, <B><I><A HREF="basic-istringstream.html">basic_istringstream</A></I></B>, <B><I><A HREF="basic-ostringstream.html">basic_ostringstream</A></I></B>, <B><I><A HREF="basic-stringstream.html">basic_stringstream</A></I></B></P>
<A NAME="sec5"><H3>Standards Conformance</H3></A>
<P><I>ISO/IEC 14882:1998 -- International Standard for Information Systems --Programming Language C++, Section 27.7</I></P>

<BR>
<HR>
<A HREF="sort-heap.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="stable-partition.html"><IMG SRC="images/bnext.gif" WIDTH=20 HEIGHT=21 ALT="Next file" BORDER=O></A>

<!-- Google Analytics tracking code -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
    _uacct = "UA-1775151-1";
    urchinTracker();
</script>
<!-- end of Google Analytics tracking code -->

</BODY>
</HTML>
