关天std::sort的第三个参数。

naturemickey 2005-06-04 07:31:27
请看下面这两个小程序:

//这个程序没有问题
#include <iostream>
#include <algorithm>

bool f(int a, int b)
{
return a > b;
}

int main(void)
{
int a[10] = {12, 6, 987, 45, 356, 1, 849, 32, 42, 58};

std::sort(a, a + 10, f);

return 0;
}

//这个程序不能运行(有Link错误)
#include <iostream>
#include <algorithm>

template <class T>
bool f(T a, T b)
{
return a > b;
}

int main(void)
{
int a[10] = {12, 6, 987, 45, 356, 1, 849, 32, 42, 58};

std::sort(a, a + 10, f<int>);

return 0;
}

第二个程序与第一个并没有太大的差别,可是为什么不行?
...全文
386 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
naturemickey 2005-06-30
  • 打赏
  • 举报
回复
真是高手,这么隐密的技术都知道。

顶。
xzgyb 2005-06-29
  • 打赏
  • 举报
回复
ilovevc(ilovevc):
c++primer的函数模版一章
强制类型转换就可以让它实例化
事实上不用static_cast,
而用
c的强制类型转换就可

std::sort(a, a + 10, ( bool (*)( int, int ) )f);
ilovevc 2005-06-29
  • 打赏
  • 举报
回复
老达摩 的这个方法不错啊. 能给个出处吗?
static_cast能干这个用吗? 标准的?
ilovevc 2005-06-29
  • 打赏
  • 举报
回复
试了一下, 确实如此. 看来又是VC6的问题.

解决方法有几种, 一种是显示实例化这个函数, 例如在main之前假如
template bool f<int>(int, int);

另外一种方法是将你的f函数作为一个functor, 例如
template<class T>
struct f
{
bool operator()(T a, T b)
{
return a > b;
}
};

使用
std::sort(a, a + 10, f<int>());
foochow 2005-06-29
  • 打赏
  • 举报
回复
用VC7.0~~~VC6.0下好多都编译不过的
xzgyb 2005-06-29
  • 打赏
  • 举报
回复
vc6对模版的支持度不好
可以用类型转换
std::sort(a, a + 10,
static_cast< bool (*)( int, int ) >( f ) );
ilovevc 2005-06-29
  • 打赏
  • 举报
回复
to老达摩
你上面的意思我明白了. 多谢.
但是, 谁又会真正这样使用呢? (除了在buggy的VC6中), 为什么不显式在<>中指定模板参数, 而要用转换这种方式呢?
xzgyb 2005-06-29
  • 打赏
  • 举报
回复
我说的好像有错误
一个函数模板当被调用时
或取地址时实例化
而强制类型转换是指导编译器
推断模板实参
从而实例化函数模板
naturemickey 2005-06-13
  • 打赏
  • 举报
回复
VC6 实在太老了。

http://groups-beta.google.com/group/freePrograming/browse_thread/thread/cbc0f8f681c0e6cf/6741b34477a0630b#6741b34477a0630b

http://groups-beta.google.com/group/microsoft.public.vc.language/browse_thread/thread/af41ab2cb54dcb2/0e68de8848c255f2?q=&rnum=3#0e68de8848c255f2

http://groups-beta.google.com/group/comp.lang.c++/browse_thread/thread/6398f6f2f100a3b/09404ad450ed82ad?q=&rnum=4#09404ad450ed82ad
mostideal 2005-06-05
  • 打赏
  • 举报
回复
对呀,,我用 dev-c++也没任何错误呀。。
foochow 2005-06-05
  • 打赏
  • 举报
回复
呵呵~~~这个当然知道,还有应该是楼主的编译器有问题吧,我这里2个程序都能够正常运行-_-
sunman1982 2005-06-05
  • 打赏
  • 举报
回复
mark-_-~
naturemickey 2005-06-05
  • 打赏
  • 举报
回复
To: foochow(恰似你的温柔)
如果自己定义operator<,大多数情况下就不需要加入第三个参数了,
难到你不明白加入第三个参数的用意吗?
如果要一个排序准则,但operator<又不适合你怎么办?
比如,用operator<定义字典的排序就不合适(虽然可以做到)。
上面这个程序并不是要做什么用意思的事,
只是测试一下而已,当然没意思。
vanillahill 2005-06-04
  • 打赏
  • 举报
回复
6.0可能对STL支持不好,GCC和7.0都不错
foochow 2005-06-04
  • 打赏
  • 举报
回复
这样做没意思吧,只有容器元素类型是用户定义的对象时,才需要自己定义能够处理该类型对象的
operator<()函数
「已注销」 2005-06-04
  • 打赏
  • 举报
回复
在VC6.0下的确有Link错误
。。。看不懂。。
naturemickey 2005-06-04
  • 打赏
  • 举报
回复

我用GCC编译了一下,也没事,
可是在VC6.0下就有Link错误。

不知是不是VC6的bug
chinaren2k 2005-06-04
  • 打赏
  • 举报
回复
vc.net下没有错误亚 不知道 怎么回事
sunman1982 2005-06-04
  • 打赏
  • 举报
回复
你添加一个输出 看看就好了 一样的
sunman1982 2005-06-04
  • 打赏
  • 举报
回复
dev c++ 没有任何错误 运行很好啊

64,654

社区成员

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

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