- 论坛徽章:
- 0
|
// STL实现拒绝
list<Widget> lw;
...
lw.assign(vw.rbegin(), vw.rend()); // 也拒绝
SpecialContainer<Widget> scw;
...
scw.insert(scw.end(), lw.begin(), lw.end()); // 同上
这些调用看起来相当不同,但它们全都由于相同的原因而失败:在STL实现里缺乏成员函数模板。对它们有
一种单独的治疗方法:使用copy和插入迭代器(参见条款30)。例如,这里是上面例子的变通办法:
istream_iterator<Widget> begin(cin), end;
vector<Widget> vw; // 默认构造vw;
copy(begin, end, back_inserter(vw)); // 然后把cin中的
// Widget拷贝进去
list<Widget> lw;
...
lw.clear(); // 去除lw的老
copy(vw.rbegin(), vw.rend(), back_inserter(lw)); // Widget;把
// vw的Widget拷贝进去(以
// 反序)
SpecialContainer<Widget> scw;
...
copy(lw.begin(), lw.end(), // 把lw的Widget拷贝到
inserter(scw, scw.end())); // scw的结尾
我鼓励你在伴随MSVC4-5的库上使用这样的基于copy的变通办法,但是注意!不要满足于这个变通办法,你
忘记了它们只是变通办法。正如条款5解释的,使用copy算法几乎总是不如使用一个区间成员函数,所以一
旦你有机会把你的STL平台升级到支持成员函数模板的版本,就在区间成员函数是正确方法的地方停止使用
copy。
用于MSVC6的另一个变通办法
你也可以对MSVC6使用MSVC4-5的变通办法,但对于MSVC6有另一个选择。作为MSVC4-5一部分的编译器
没有提供有意义的成员函数模板,所以STL实现缺乏它们的事实是无关紧要的。MSVC6的形势则不同,因为 |
|