<!--
    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>Top navigation banner</title>
        <link rel=StyleSheet
              href="../rwbanner.css"
              type="text/css"
              title="Apache stdcxx Stylesheet"/>
        <base target="toc"/>

    </head>
    <body>
        <table border=0 cellpadding=4 cellspacing=0 width=100%>
            <tr>
                <td>
                    <img src="http://apache.org/images/asf_logo.gif">
                </td>
                <td align=center>
                <td align="center" valign="center">
                    <h2>
                        <a href="http://stdcxx.apache.org"
                           target="_top">
                            Apache C++ Standard Library</a> User's Guide
                    </h2>
                    <h5>
                        <a href="frames-displayarea.html"
                           target="display">Top</a>
                        |
                        <a href="frames-tindex.html"
                           target="display">Topic Index</a>
                        |
                        <a href="noframes.html"
                           target="_top">
                            No Frames
                        </a>
                        <br>
                        <a href="frames-contents-chapter.html">
                            Chapter List
                        </a>
                        or
                        <a href="frames-contents-all.html">
                            Detailed Contents
                        </a>
                    </h5>
                </td>
                <td width="30%">&nbsp;</td>
            </tr>
         </table>

        <!-- 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>

    </body>
</html>
