SpeciаlContainer<Widget> scw;
scw.insert(scw.end(), lw.begin(), lw.end()); // Вставить в конец scw
// копию объектов Widget из lw;
// не компилируется в MSVC4-6!
Так что же делать, если вы работаете в среде MSVC4-6? Это зависит от используемой версии MSVC и того, вынуждены ли вы использовать реализацию STL, поставляемую вместе с компилятором.
SpeciаlContainer<Widget> scw; … scw.insert(scw.end(), lw.begin(), lw.end()); // То же Несмотря на внешние различия, выделенные вызовы отвергаются компилятором по одной и той же причине: из-за отсутствия шаблонов функций класса в реализации STL. Соответственно и решение во всех случаях оказывается одним и тем же: замена вызовом copy с итератором вставки (см. совет 30). Ниже приведены обходные решения для всех примеров, приведенных ранее: istream_iterator<Widget> begin(cin), end; vector<Widget> vw(begin, end); //Создать vw конструктором copy(begin, end, back_inserter(vw)); // по умолчанию и скопировать // в него объекты Widget из cin list<Widget> lw; … lw.clear(); // Удалить из lw старые объекты; copy(vw.rbegin(), vw.rend(), // скопировать объекты из vw back_inserter(lw)); //(в обратном порядке) SpecialContainer<Widget> scw; copy(lw.begin(), lw.end(), // Скопировать объекты Widget inserter(scw, scw.end())); // из lw в конец scw Я рекомендую использовать эти обходные решения с библиотекой, входящей в комплект поставки MSVC4-5. С другой стороны, будьте внимательны и не забывайте о том, что эти решения являются обходными. Как показано в совете 5, алгоритм copy почти всегда уступает интервальной функции контейнера, поэтому как только представится возможность обновить платформу STL до версии с поддержкой шаблонов функций класса, откажитесь от использования copy в тех местах, где следовало бы использовать интервальные функции.
Обходное решение для MSVC4-5
Еще раз посмотрим на правильный код, который не компилируется для реализации STL из поставки MSVC4-6: vector<Widget> vw(begin, end); // Отвергается реализацией STL // из поставки MSVC4-6 list<Widget> lw; … lw.assign(vw.rbegin(), vw.rend()); // То жеSpeciаlContainer<Widget> scw; … scw.insert(scw.end(), lw.begin(), lw.end()); // То же Несмотря на внешние различия, выделенные вызовы отвергаются компилятором по одной и той же причине: из-за отсутствия шаблонов функций класса в реализации STL. Соответственно и решение во всех случаях оказывается одним и тем же: замена вызовом copy с итератором вставки (см. совет 30). Ниже приведены обходные решения для всех примеров, приведенных ранее: istream_iterator<Widget> begin(cin), end; vector<Widget> vw(begin, end); //Создать vw конструктором copy(begin, end, back_inserter(vw)); // по умолчанию и скопировать // в него объекты Widget из cin list<Widget> lw; … lw.clear(); // Удалить из lw старые объекты; copy(vw.rbegin(), vw.rend(), // скопировать объекты из vw back_inserter(lw)); //(в обратном порядке) SpecialContainer<Widget> scw; copy(lw.begin(), lw.end(), // Скопировать объекты Widget inserter(scw, scw.end())); // из lw в конец scw Я рекомендую использовать эти обходные решения с библиотекой, входящей в комплект поставки MSVC4-5. С другой стороны, будьте внимательны и не забывайте о том, что эти решения являются обходными. Как показано в совете 5, алгоритм copy почти всегда уступает интервальной функции контейнера, поэтому как только представится возможность обновить платформу STL до версии с поддержкой шаблонов функций класса, откажитесь от использования copy в тех местах, где следовало бы использовать интервальные функции.