<!--
    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> Reference Guide
                    </h2>
                    <h5>
                        <a href="frames-displayarea.html"
                           target="display">Top</a>
                        |
                        <a href="frames-tindex.html"
                           target="display">Member Index</a>
                        |
                        <a href="noframes.html"
                           target="_top">
                            No Frames
                        </a>
                        <br>
                        Class Indexes:
                        <a href="frames-classes-alpha.html">Alphabetical</a>
                        or
                        <a href="frames-classes-func.html">Functional Groups</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>
