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

        <style type="text/css">
            body {
                background: url("http://apache.org/images/asf_logo.gif");
                background-repeat: no-repeat
            }
        </style>
    </head>
    <body>
        <table border=0 cellpadding=4 cellspacing=0 width=100%>
            <tr>
                <td align=center>
                    <h2>
                        <a href="http://incubator.apache.org/stdcxx"
                           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>
            </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>
