Книга: Эффективное использование STL
MSVC версий 4-6
MSVC версий 4-6
К сожалению, в реализации STL, входящей в комплект поставки версий 4-6, шаблоны функций не объявляются. Библиотека изначально разрабатывалась для MSVC версии 4, а этот компилятор, как и большинство компиляторов того времени, не обладал поддержкой шаблонов функций классов. При переходе от MSCV4 к MSVC6 поддержка этих шаблонов была включена в компилятор, но вследствие судебных дел, косвенно затрагивавших фирму Microsoft, библиотека оставалась практически в неизменном состоянии.
Поскольку реализация STL, поставляемая с MSVC4-6, предназначалась для компилятора без поддержки шаблонов функций классов, авторы библиотеки имитировали эти шаблоны и заменили их конкретными функциями, которым при вызове передавались итераторы контейнера соответствующего типа. Например, шаблон insert
был заменен следующей функцией:
void insert(iterator position, // "iterator" - тип итератора
iterator first, iterator last); // для конкретного контейнера
Эта ограниченная форма интервальных функций позволяла выполнить интервальную вставку из vector<Widget>
в vector<Widget>
или из list<int>
в list<int>
, но смешанные операции (например, вставка из vector<Widget>
в list<Widget>
или из set<int>
в deque<int>
) не поддерживались. Более того, не поддерживалась даже интервальная вставка (а также конструирование или assign
) из vector<long>
в vector<int>
, поскольку итераторы vector<long>::iterator
и vector<int>::iterator
относятся к разным типам. В результате следующий фрагмент, принимаемый другими компиляторами, не компилируется в MSVC4-6:
istream_iterator<Widget> begin(cin), end; // Создать итераторы begin и end
// для чтения объектов Widget
// из cin (см. совет 6).
vector<Widget> vw(begin, end); // Прочитать объекты Widget
// из cin в vw (см. совет 6)
// не компилируется в MSVC4-6!
list<Widget> lw;
lw.assign(vw.rbegin(), vw.rend()); // Присвоить lw содержимое vw
// (в обратном порядке);
// не компилируется в MSVC4-6!
SpeciаlContainer<Widget> scw;
scw.insert(scw.end(), lw.begin(), lw.end()); // Вставить в конец scw
// копию объектов Widget из lw;
// не компилируется в MSVC4-6!
Так что же делать, если вы работаете в среде MSVC4-6? Это зависит от используемой версии MSVC и того, вынуждены ли вы использовать реализацию STL, поставляемую вместе с компилятором.
- Обходное решение для MSVC4-5
- Обходное решение для MSVC6
- Совместимость клиентов и серверов различных версий
- Работа с журналом версий
- Использование предыдущих версий файлов
- Использование средств удаленного администрирования для настройки различных версий Linux
- Сравнение времени выполнения различных версий функции str_cli
- Нумерация версий WSH
- Поддержка версий сериализации объектов
- Опыт перехода от 16-разрядных версий Windows к 32-разрядным
- Приложение Сравнительные характеристики Windows версий XP и Seven
- 7.2. Особенности версий Windows