lw.assign(vw.rbegin, vw.rend); // Присвоить lw содержимое vw

                                   // (в обратном порядке);

                                   // не компилируется в MSVC4-6!

SpeciаlContainer scw;

scw.insert(scw.end, lw.begin, lw.end); // Вставить в конец scw

                                             // копию объектов Widget из lw;

                                             // не компилируется в MSVC4-6!

Так что же делать, если вы работаете в среде MSVC4-6? Это зависит от используемой версии MSVC и того, вынуждены ли вы использовать реализацию STL, поставляемую вместе с компилятором.

<p>Обходное решение для MSVC4-5</p>

Еще раз посмотрим на правильный код, который не компилируется для реализации STL из поставки MSVC4-6:

vector vw(begin, end); // Отвергается реализацией STL

                               // из поставки MSVC4-6

list lw;

lw.assign(vw.rbegin, vw.rend); // То же

SpeciаlContainer scw;

scw.insert(scw.end, lw.begin, lw.end); // То же

Несмотря на внешние различия, выделенные вызовы отвергаются компилятором по одной и той же причине: из-за отсутствия шаблонов функций класса в реализации STL. Соответственно и решение во всех случаях оказывается одним и тем же: замена вызовом copy с итератором вставки (см. совет 30). Ниже приведены обходные решения для всех примеров, приведенных ранее:

istream_iterator begin(cin), end;

vector vw(begin, end); //Создать vw конструктором

copy(begin, end, back_inserter(vw)); // по умолчанию и скопировать

                                     // в него объекты Widget из cin

list lw;

lw.clear;                  // Удалить из lw старые объекты;

copy(vw.rbegin, vw.rend, // скопировать объекты из vw

 back_inserter(lw));         //(в обратном порядке)

SpecialContainer scw;

copy(lw.begin, lw.end,  // Скопировать объекты Widget

 inserter(scw, scw.end)); // из lw в конец scw

Я рекомендую использовать эти обходные решения с библиотекой, входящей в комплект поставки MSVC4-5. С другой стороны, будьте внимательны и не забывайте о том, что эти решения являются обходными. Как показано в совете 5, алгоритм copy почти всегда уступает интервальной функции контейнера, поэтому как только представится возможность обновить платформу STL до версии с поддержкой шаблонов функций класса, откажитесь от использования copy в тех местах, где следовало бы использовать интервальные функции.

<p>Обходное решение для MSVC6</p>

Обходное решение из предыдущего раздела подходит и для MSVC6, но в этом случае существует и другой вариант. Компиляторы MSVC4-5 не обладают полноценной поддержкой шаблонов функций класса, поэтому отсутствие этих шаблонов в реализации STL несущественно. В MSVC6 дело обстоит иначе, поскольку компилятор этой среды поддерживает шаблоны функций класса. Таким образом, возникает естественное желание заменить реализацию STL из поставки MSVC6 другой реализацией с шаблонами функций классов, предписанными Стандартом.

В совете 50 упоминаются свободно распространяемые реализации STL от SGI и STLport; в списках поддерживаемых компиляторов обеих реализаций упоминается MSVC6. Кроме того, можно приобрести новейшую MSVC-совместимую реализацию STL от Dinkumware. У каждого из этих вариантов есть свои достоинства и недостатки.

Реализации SGI и STLport распространяются бесплатно, поэтому какая-либо официальная поддержка в этих случаях попросту отсутствует. Более того, поскольку реализации SGI и STLport рассчитаны на работу с разными компиляторами, вам придется дополнительно настроить их для обеспечения максимального быстродействия в MSVC6. В частности, может потребоваться включение поддержки шаблонов функций классов — из-за совместимости с большим количеством разных компиляторов в SGI и/или STLport эта поддержка отключена по умолчанию. Возможно, также придется позаботиться о компоновке с другими библиотеками MSVC6 (особенно DLL), проследить за использованием соответствующих версий для отладки и т. д.

Перейти на страницу:

Похожие книги