关于vc6 list.sort(_Pred)

ddc 2010-11-24 11:46:20

list.sort(_Pred)
gcc vc9都能编译通过,vc6不行,查看源码,gcc定义是
template<type _StrictWeakOrdering>
void sort(_StrictWeakOrdering) ...

vc9是
template<class _Pr3>
void sort(_Pr3 _Pred)...

vc6是
teypdef greater<_Ty> _Pr3 ;
void sort(_Pr3 _Pr)...

没有用模板,而那个参数其实是里面merge()原封不动带进去的,导致只能用greater()排序,就是说vc6下只能有2个选择:默认"<和greater(),其实是>.

虽说vc6对模板支持不好,但如此简单的东西为什么不实现?改vc6代码,sort()和merge()都加模板参数,编译通过,运行正常,但是不能这样做,否则别人编译不了.而且写那些代码的人比我聪明多了,一定有它的道理.
另一种办法是特化greater<>,但是只有放在functional文件里才行,放我的代码里编译不过.

求vc6下用自定义排序对list.sort(Pred)调用的方法.



template<class _Pr3>
void sort(_Pr3 _Pr)
{if (2 <= size())
{const size_t _MAXN = 15;
_Myt _X(allocator), _A[_MAXN + 1];
size_t _N = 0;
while (!empty())
{_X.splice(_X.begin(), *this, begin());
size_t _I;
for (_I = 0; _I < _N && !_A[_I].empty(); ++_I)
{_A[_I].merge(_X, _Pr);
_A[_I].swap(_X); }
if (_I == _MAXN)
_A[_I].merge(_X, _Pr);
else
{_A[_I].swap(_X);
if (_I == _N)
++_N; }}
while (0 < _N)
merge(_A[--_N], _Pr); }}
...全文
266 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mathredstar 2011-09-29
  • 打赏
  • 举报
回复
不需要升级vc6,只需要替换一下其中的STL就行了,甚至你可以用boost里面的STL
ForestDB 2010-11-25
  • 打赏
  • 举报
回复
没记错的话template是在VC6编译器之后的事,事后加上去的东西。
lsupper 2010-11-24
  • 打赏
  • 举报
回复
楼主升级吧...
老邓 2010-11-24
  • 打赏
  • 举报
回复
VS编译器是免费的,实在不理由不升级编译器。
Proteas 2010-11-24
  • 打赏
  • 举报
回复
VC6 是九几年的产品,对泛型支持不好。
gules 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ddc 的回复:]
引用 6 楼 gules 的回复:

我不明白楼主为什么一定要为list::sort函数传递一个函数对象参数呢?你为_Ty的模板实参类型写一个“<”操作符重载(严格弱序的)函数,然后调用sort函数的默认版不就行了!

考虑过,三个原因,一是容器中存的是指针,二是这些类有两种排序方式,一个按索引,一个按名称,不同功能需要切换排序方式;三是我写的也是个模板,使用的是其他人:_Ty别人定义,l……
[/Quote]

原来如此,两个解决办法:一、就是他们说的升级编译器;二、替换VC6的STL实现,如使用STLport。
ddc 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gules 的回复:]

我不明白楼主为什么一定要为list::sort函数传递一个函数对象参数呢?你为_Ty的模板实参类型写一个“<”操作符重载(严格弱序的)函数,然后调用sort函数的默认版不就行了!
[/Quote]
考虑过,三个原因,一是容器中存的是指针,二是这些类有两种排序方式,一个按索引,一个按名称,不同功能需要切换排序方式;三是我写的也是个模板,使用的是其他人:_Ty别人定义,list<_Ty *>在我这里,所以最好不要让别人改,而且要改数十个分散在不同地方的_Ty,不太现实。
luciferisnotsatan 2010-11-24
  • 打赏
  • 举报
回复
升级编译器吧
libinfei8848 2010-11-24
  • 打赏
  • 举报
回复
使用普通的纯函数吧直接bool lessX(...)
gules 2010-11-24
  • 打赏
  • 举报
回复
我不明白楼主为什么一定要为list::sort函数传递一个函数对象参数呢?你为_Ty的模板实参类型写一个“<”操作符重载(严格弱序的)函数,然后调用sort函数的默认版不就行了!
ddc 2010-11-24
  • 打赏
  • 举报
回复
为了保持其他模块兼容,必须用vc6,实在不行就只有自己写个排序算法,程序外面显示调用。
cphj 2010-11-24
  • 打赏
  • 举报
回复
VC6的确是优秀的软件,但它一样也有bug,只是比普通软件少而已

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧