• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0.1 Transitional//EN">
2
3<html>
4<head>
5<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
6<title>Boost.MultiIndex Documentation - Compiler specifics</title>
7<link rel="stylesheet" href="style.css" type="text/css">
8<link rel="start" href="index.html">
9<link rel="prev" href="reference/key_extraction.html">
10<link rel="up" href="index.html">
11<link rel="next" href="performance.html">
12</head>
13
14<body>
15<h1><img src="../../../boost.png" alt="boost.png (6897 bytes)" align=
16"middle" width="277" height="86">Boost.MultiIndex Compiler specifics</h1>
17
18<div class="prev_link"><a href="reference/key_extraction.html"><img src="prev.gif" alt="key extraction" border="0"><br>
19Key extraction
20</a></div>
21<div class="up_link"><a href="index.html"><img src="up.gif" alt="index" border="0"><br>
22Index
23</a></div>
24<div class="next_link"><a href="performance.html"><img src="next.gif" alt="performance" border="0"><br>
25Performance
26</a></div><br clear="all" style="clear: all;">
27
28<hr>
29
30<p>
31Boost.MultiIndex utilizes some C++11 capabilities but is also equipped
32to work reasonably well in decent C++03-compliant environments.
33We list some of the possible limitations along with suitable workarounds when available.
34</p>
35
36<h2>Contents</h2>
37
38<ul>
39  <li><a href="#move">Move semantics</a></li>
40  <li><a href="#allocator_awareness">Allocator awareness</a></li>
41  <li><a href="#emplace">Emplace functions</a></li>
42  <li><a href="#initializer_list">Initializer lists</a></li>
43  <li><a href="#tuple">Tuples</a></li>
44  <li><a href="#symbol_reduction">Reduction of symbol name lengths</a>
45    <ul>
46      <li><a href="#argument_limitation">Limitation of maximum number of arguments</a></li>
47      <li><a href="#type_hiding">Type hiding</a></li>
48  </ul>
49  </li>
50  <li><a href="#legacy">Legacy compilers</a></li>
51</ul>
52
53<h2><a name="move">Move semantics</a></h2>
54
55<p>
56Boost.MultiIndex uses <a href="../../../doc/html/move.html">Boost.Move</a>
57to support compilers without rvalue references. In such scenarios, taking
58advantage of <code>multi_index_container&lt;Value&gt;</code> capabilities for
59increased efficiency in insertion and handling of moveable-only elements will
60require that <code>Value</code> be suitably instrumented.
61</p>
62
63<h2><a name="allocator_awareness">Allocator awareness</a></h2>
64
65<p>
66In pre-C++11 compilers or defective environments without proper
67<a href="https://en.cppreference.com/w/cpp/named_req/AllocatorAwareContainer">allocator
68awareness</a> machinery (basically, <code>std::allocator_traits</code>),
69Boost.MultiIndex behaves as if
70<code>std::allocator_traits&lt;allocator_type>::propagate_on_container_*::value</code>
71were <code>false</code> for all allocators.
72</p>
73
74<h2><a name="emplace">Emplace functions</a></h2>
75
76<p>
77In compilers without variadic template support, Boost.MultiIndex emplace
78functions emulate this missing functionality by accepting up to
79<code>BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS</code>
80construction arguments that are internally forwarded with
81<a href="../../../doc/html/move.html">Boost.Move</a>:
82only constant lvalue references and rvalues are permitted as construction arguments
83in such case.
84</p>
85
86<p>
87<code>BOOST_MULTI_INDEX_LIMIT_VARTEMPL_ARGS</code>, which by default is 5, can
88be globally defined by the user to a different value.
89</p>
90
91<h2><a name="initializer_list">Initializer lists</a></h2>
92
93<p>
94No transparent emulation of this functionality can be provided in the absence of
95<code>std::initializer_list</code>: consider
96<a href="../../../libs/assign/index.html">Boost.Assign</a> as a
97possible replacement.
98</p>
99
100<h2><a name="tuple">Tuples</a></h2>
101
102<p>
103Everywhere where <code>std::tuple</code>s are used in the library interface,
104<code>boost::tuple</code>s can be resorted to in their place. The converse, however,
105is not true.
106</p>
107
108<h2><a name="symbol_reduction">Reduction of symbol name lengths</a></h2>
109
110<p>
111The types generated on the instantiations of <code>multi_index_container</code>s
112typically produce very long symbol names, sometimes beyond the internal limits
113of some compilers. There are several techniques to shorten generated symbol
114names: these techniques have also the beneficial side effect that resulting error
115messages are more readable.
116</p>
117
118<h3><a name="argument_limitation">Limitation of maximum number of arguments</a></h3>
119
120<p>
121The class templates <a href="reference/indices.html#indexed_by"><code>indexed_by</code></a>,
122<a href="reference/indices.html#tag"><code>tag</code></a> and
123<a href="reference/key_extraction.html#composite_key"><code>composite_key</code></a>
124accept a variable number of arguments whose maximum number is limited by
125internal macros. Even non-used arguments contribute to the final types,
126so manually adjusting the corresponding macros can result in a modest reduction
127of symbol names.
128</p>
129
130<p align="center">
131<table cellspacing="0">
132  <caption><b>Limiting maximum number of arguments of some class templates
133  of Boost.MultiIndex.</b></caption>
134<tr>
135  <th>class template</th>
136  <th>limiting macro</th>
137  <th>default value</th>
138</tr>
139<tr>
140  <td align="center">&nbsp;<code>indexed_by</code>&nbsp;</td>
141  <td align="center">&nbsp;<code>BOOST_MULTI_INDEX_LIMIT_INDEXED_BY_SIZE</code>&nbsp;</td>
142  <td align="center">20</td>
143</tr>
144<tr class="odd_tr">
145  <td align="center">&nbsp;<code>tag</code>&nbsp;</td>
146  <td align="center">&nbsp;<code>BOOST_MULTI_INDEX_LIMIT_TAG_SIZE</code>&nbsp;</td>
147  <td align="center">20</td>
148</tr>
149<tr>
150  <td align="center">&nbsp;<code>composite_key</code>&nbsp;</td>
151  <td align="center">&nbsp;<code>BOOST_MULTI_INDEX_LIMIT_COMPOSITE_KEY_SIZE</code>&nbsp;</td>
152  <td align="center">10</td>
153</tr>
154</table>
155</p>
156
157<h3><a name="type_hiding">Type hiding</a></h3>
158
159<p>
160Consider a typical instantiation of <code>multi_index_container</code>:
161</p>
162
163<blockquote><pre>
164<span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
165  <span class=identifier>employee</span><span class=special>,</span>
166  <span class=identifier>indexed_by</span><span class=special>&lt;</span>
167    <span class=identifier>ordered_unique</span><span class=special>&lt;</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;</span> <span class=special>&gt;,</span>
168    <span class=identifier>ordered_non_unique</span><span class=special>&lt;</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>,</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span><span class=special>,&amp;</span><span class=identifier>employee</span><span class=special>::</span><span class=identifier>name</span><span class=special>&gt;</span> <span class=special>&gt;,</span>
169    <span class=identifier>ordered_unique</span><span class=special>&lt;</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>,</span><span class=keyword>int</span><span class=special>,&amp;</span><span class=identifier>employee</span><span class=special>::</span><span class=identifier>ssnumber</span><span class=special>&gt;</span> <span class=special>&gt;</span>
170  <span class=special>&gt;</span>
171<span class=special>&gt;</span> <span class=identifier>employee_set</span><span class=special>;</span>
172</pre></blockquote>
173
174<p>
175Then, for instance, the type <code>employee_set::nth_index&lt;0&gt;::type</code>
176resolves to the following in GCC:
177</p>
178
179<blockquote><pre>
180<span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>detail</span><span class=special>::</span><span class=identifier>ordered_index</span><span class=special>&lt;</span>
181  <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;,</span>
182  <span class=identifier>std</span><span class=special>::</span><span class=identifier>less</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;,</span>
183  <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>detail</span><span class=special>::</span><span class=identifier>nth_layer</span><span class=special>&lt;</span>
184    <span class=number>1</span><span class=special>,</span> <span class=identifier>employee</span><span class=special>,</span>
185    <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>indexed_by</span><span class=special>&lt;</span>
186      <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>ordered_unique</span><span class=special>&lt;</span>
187        <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span>
188      <span class=special>&gt;,</span>
189      <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>ordered_non_unique</span><span class=special>&lt;</span>
190        <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>,</span> <span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span><span class=special>,</span> <span class=special>&amp;</span><span class=identifier>employee</span><span class=special>::</span><span class=identifier>name</span><span class=special>&gt;,</span>
191        <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span>
192      <span class=special>&gt;,</span>
193      <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>ordered_unique</span><span class=special>&lt;</span>
194        <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>,</span> <span class=keyword>int</span><span class=special>,</span> <span class=special>&amp;</span><span class=identifier>employee</span><span class=special>::</span><span class=identifier>ssnumber</span><span class=special>&gt;,</span>
195        <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span>
196      <span class=special>&gt;,</span>
197      <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span>
198      <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span>
199      <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>,</span> <span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span>
200    <span class=special>&gt;,</span>
201    <span class=identifier>std</span><span class=special>::</span><span class=identifier>allocator</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;</span>
202  <span class=special>&gt;,</span>
203  <span class=identifier>boost</span><span class=special>::</span><span class=identifier>mpl</span><span class=special>::</span><span class=identifier>vector0</span><span class=special>&lt;</span><span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>&gt;,</span>
204  <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>detail</span><span class=special>::</span><span class=identifier>ordered_unique_tag</span>
205<span class=special>&gt;</span>
206</pre></blockquote>
207
208<p>
209It can be seen that a significant portion of the type name is contributed by
210the <code>indexed_by&lt;...&gt;</code> part, which is nothing but an expanded
211version of the index specifier list provided in the definition of
212<code>employee_set</code>. We can prevent this very long name from appearing
213in the final type by encapsulating it into another, shorter-named construct:
214</p>
215
216<blockquote><pre>
217<span class=comment>// reducing symbol names through type hiding
218// type hide the index specifier list within employee_set_indices</span>
219
220<span class=keyword>struct</span> <span class=identifier>employee_set_indices</span><span class=special>:</span>
221  <span class=identifier>indexed_by</span><span class=special>&lt;</span>
222    <span class=identifier>ordered_unique</span><span class=special>&lt;</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;</span> <span class=special>&gt;,</span>
223    <span class=identifier>ordered_non_unique</span><span class=special>&lt;</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>,</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>string</span><span class=special>,&amp;</span><span class=identifier>employee</span><span class=special>::</span><span class=identifier>name</span><span class=special>&gt;</span> <span class=special>&gt;,</span>
224    <span class=identifier>ordered_unique</span><span class=special>&lt;</span><span class=identifier>member</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>,</span><span class=keyword>int</span><span class=special>,&amp;</span><span class=identifier>employee</span><span class=special>::</span><span class=identifier>ssnumber</span><span class=special>&gt;</span> <span class=special>&gt;</span>
225  <span class=special>&gt;</span>
226<span class=special>{};</span>
227
228<span class=keyword>typedef</span> <span class=identifier>multi_index_container</span><span class=special>&lt;</span>
229  <span class=identifier>employee</span><span class=special>,</span>
230  <span class=identifier>employee_set_indices</span>
231<span class=special>&gt;</span> <span class=identifier>employee_set</span><span class=special>;</span>
232</pre></blockquote>
233
234<p>
235<code>employee_set_indices</code> works as a conventional <code>typedef</code>
236in all respects, save for a detail: its name does not explicitly
237include the information contained in the <code>indexed_by</code> instantiation.
238Applying this technique, <code>employee_set::nth_index&lt;0&gt;::type</code>
239now becomes:
240</p>
241
242<blockquote><pre>
243<span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>detail</span><span class=special>::</span><span class=identifier>ordered_index</span><span class=special>&lt;</span>
244  <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>identity</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;,</span>
245  <span class=identifier>std</span><span class=special>::</span><span class=identifier>less</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;,</span>
246  <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>detail</span><span class=special>::</span><span class=identifier>nth_layer</span><span class=special>&lt;</span>
247    <span class=number>1</span><span class=special>,</span> <span class=identifier>employee</span><span class=special>,</span>
248    <span class=identifier>employee_set_indices</span><span class=special>,</span>
249    <span class=identifier>std</span><span class=special>::</span><span class=identifier>allocator</span><span class=special>&lt;</span><span class=identifier>employee</span><span class=special>&gt;</span>
250  <span class=special>&gt;,</span>
251  <span class=identifier>boost</span><span class=special>::</span><span class=identifier>mpl</span><span class=special>::</span><span class=identifier>vector0</span><span class=special>&lt;</span><span class=identifier>mpl_</span><span class=special>::</span><span class=identifier>na</span><span class=special>&gt;,</span>
252  <span class=identifier>boost</span><span class=special>::</span><span class=identifier>multi_index</span><span class=special>::</span><span class=identifier>detail</span><span class=special>::</span><span class=identifier>ordered_unique_tag</span>
253<span class=special>&gt;</span>
254</pre></blockquote>
255
256<p>
257which is considerably shorter than the original, and also more
258easily parsed by a human reader. Type hiding would not work if, instead of
259making <code>employee_set_indices</code> a derived <code>struct</code> of
260<code>indexed_by&lt;...&gt;</code>, we had defined it as a <code>typedef</code>:
261<code>typedef</code>s are syntactic aliases and usually get expanded
262by the compiler before doing any further type handling.
263</p>
264
265<p>
266Type hiding techniques can also be applied to <code>composite_key</code> intantiations,
267which often contribute a great deal to symbol name lengths.
268</p>
269
270<h2><a name="legacy">Legacy compilers</a></h2>
271
272<p>
273Boost.MultiIndex support for legacy compilers is not actively kept, so if you happen
274to work with an old environment you might need to use a former version of the library.
275A table is provided of some legacy compilers along with the latest version of
276Boost.MultiIndex known to work for them (frequently with limitations as explained
277in the corresponding compiler specifics section.) If you successfully try one of those
278with newer versions of Boost.MultiIndex than stated here, please report back so that
279the information can be updated.
280</p>
281
282<p align="center">
283<table cellspacing="0" cellpadding="5">
284  <caption><b>Support for legacy compilers.</b></caption>
285<tr>
286  <th>Compiler</th>
287  <th>Latest known<br>compatible version</th>
288  <th>Date</th>
289</tr>
290<tr>
291  <td>Borland C++ Builder 6.4 through 2006, CodeGear C++Builder 2010</td>
292  <td>Never worked with Boost.MultiIndex</td>
293  <td></td>
294</tr>
295<tr class="odd_tr">
296  <td>Comeau C/C++ 4.3.10.1 for Windows (VC++ 9.0 backend)</td>
297  <td><a href="http://www.boost.org/doc/libs/1_38_0/libs/multi_index/doc/compiler_specifics.html#comeau_43101_win_vc7_71">Boost 1.38</a></td>
298  <td>February 2009</td>
299</tr>
300<tr>
301  <td>Compaq C++ 6.5-042 through 7.1-006 for Tru64 UNIX</td>
302  <td><a href="http://www.boost.org/doc/libs/1_38_0/libs/multi_index/doc/compiler_specifics.html#compaq_65">Boost 1.38</a></td>
303  <td>February 2009</td>
304</tr>
305<tr class="odd_tr">
306  <td>GCC 3.2 through 3.4</td>
307  <td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#gcc_32">Boost 1.41</a></td>
308  <td>November 2009</td>
309</tr>
310<tr>
311  <td>HP aC++ A.06.12 through A.06.17 for HP-UX IA64</td>
312  <td><a href="http://www.boost.org/doc/libs/1_38_0/libs/multi_index/doc/compiler_specifics.html#acc_612_ia64">Boost 1.38</a></td>
313  <td>February 2009</td>
314</tr>
315<tr class="odd_tr">
316  <td>HP aC++ A.03.80 through A.03.85 for HP-UX PA-RISC</td>
317  <td><a href="http://www.boost.org/doc/libs/1_38_0/libs/multi_index/doc/compiler_specifics.html#acc_380_pa_risc">Boost 1.38</a></td>
318  <td>February 2009</td>
319</tr>
320<tr>
321  <td>IBM VisualAge C++ V6.0 for AIX</td>
322  <td><a href="http://www.boost.org/doc/libs/1_33_1/libs/multi_index/doc/compiler_specifics.html#va_60">Boost 1.33.1</a></td>
323  <td>December 2006</td>
324</tr>
325<tr class="odd_tr">
326  <td>IBM XL C/C++ V9.0 through V10.1 for AIX</td>
327  <td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#xl_90">Boost 1.41</a></td>
328  <td>November 2009</td>
329</tr>
330<tr>
331  <td>Intel C++ Compiler for Linux 8.1 through 11.1</td>
332  <td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#intel_81_lin">Boost 1.41</a></td>
333  <td>November 2009</td>
334</tr>
335<tr class="odd_tr">
336  <td>Intel C++ Compiler for Mac OS 9.1 through 11.0</td>
337  <td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#intel_91_mac">Boost 1.41</a></td>
338  <td>November 2009</td>
339</tr>
340<tr>
341  <td>Intel C++ Compiler for Windows 32-bit 8.0 through 11.1</td>
342  <td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#intel_80_win">Boost 1.41</a></td>
343  <td>November 2009</td>
344</tr>
345<tr class="odd_tr">
346  <td>Intel C++ Compiler for Windows 64-bit 10.0 through 11.11</td>
347  <td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#intel_100_win64">Boost 1.41</a></td>
348  <td>November 2009</td>
349</tr>
350<tr>
351  <td>Metrowerks CodeWarrior 8.3</td>
352  <td><a href="http://www.boost.org/doc/libs/1_36_0/libs/multi_index/doc/compiler_specifics.html#cw_83">Boost 1.36</a></td>
353  <td>August 2008</td>
354</tr>
355<tr class="odd_tr">
356  <td>Metrowerks CodeWarrior 9 through 9.5</td>
357  <td><a href="http://www.boost.org/doc/libs/1_34_1/libs/multi_index/doc/compiler_specifics.html#cw_9x">Boost 1.34.1</a></td>
358  <td>July 2007</td>
359</tr>
360<tr>
361  <td>Microsoft Visual C++ 6.0 Service Pack 5</td>
362  <td><a href="http://www.boost.org/doc/libs/1_36_0/libs/multi_index/doc/compiler_specifics.html#msvc_60">Boost 1.36</a></td>
363  <td>August 2008</td>
364</tr>
365<tr class="odd_tr">
366  <td>Microsoft Visual C++ 7.0</td>
367  <td><a href="http://www.boost.org/doc/libs/1_35_0/libs/multi_index/doc/compiler_specifics.html#msvc_70">Boost 1.35</a></td>
368  <td>March 2008</td>
369</tr>
370<tr>
371  <td>Sun Studio 10 through 12 Update 1 for Solaris</td>
372  <td><a href="http://www.boost.org/doc/libs/1_41_0/libs/multi_index/doc/compiler_specifics.html#sun_10">Boost 1.41</a></td>
373  <td>November 2009</td>
374</tr>
375</table>
376</p>
377
378<hr>
379
380<div class="prev_link"><a href="reference/key_extraction.html"><img src="prev.gif" alt="key extraction" border="0"><br>
381Key extraction
382</a></div>
383<div class="up_link"><a href="index.html"><img src="up.gif" alt="index" border="0"><br>
384Index
385</a></div>
386<div class="next_link"><a href="performance.html"><img src="next.gif" alt="performance" border="0"><br>
387Performance
388</a></div><br clear="all" style="clear: all;">
389
390<br>
391
392<p>Revised January 25th 2020</p>
393
394<p>&copy; Copyright 2003-2020 Joaqu&iacute;n M L&oacute;pez Mu&ntilde;oz.
395Distributed under the Boost Software
396License, Version 1.0. (See accompanying file <a href="../../../LICENSE_1_0.txt">
397LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
398http://www.boost.org/LICENSE_1_0.txt</a>)
399</p>
400
401</body>
402</html>
403