<!--
    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" valign="center">
                    <h2>
                        <a href="http://stdcxx.apache.org"
                           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>
                <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>
