关于C++函数指针和模板的问题,求大牛~

我想用C++写一个关于模板的排序函数,并且传入一个用于比较大小的函数的函数指针,可是不知道为什么编译不通过,谢谢~#include<stdio.h>#include<st... 我想用C++写一个关于模板的排序函数,并且传入一个用于比较大小的函数的函数指针,可是不知道为什么编译不通过,谢谢~

#include<stdio.h>
#include<string.h>
template <class T>
void Test( T arr[] , int (*func)( T , T ) )
{
}
void main()
{
char str[2][5] = { "bbb" , "aaa" } ;
Test( str , strcmp );
}
展开
 我来答
Bk0X
2012-09-04 · TA获得超过9413个赞
知道小有建树答主
回答量:1217
采纳率:60%
帮助的人:673万
展开全部
写成
template <class T, class Func>
void Test(T arr[], Func func)
{
func(arr[0], arr[1]);
}

void main()
{
char str[2][5] = { "bbb" , "aaa" } ;
Test(str, strcmp);
}

其实这种函数的写法, 你可以参照下STL的写法. 打开头文件algorithm里面尽是这些.
追问
谢谢~ 这个答案太让我兴奋了, 但是你能告诉我我的为什么编译不通过吗??是哪儿的语法有问题啊
追答
Test(str, strcmp); 由第一个参数推导T的类型, 
编译器推导出来的实例是 Test(char (*)[5], int (*)(char[5], char[5]));

可以看出, 第二个参数, 回调函数的类型被推导为int (*)(char[5], char[5])
而strcmp的类型是 int(*) (const char*, const char*) 不匹配.

像你这样强制确定回调函数声明是很难完美匹配的, 就算强制匹配也失去了模板的意义.
而回调函数定义成单独的模板参数在设计上也更加好.

Func 能够匹配所有的支持( )括号操作符的"东西", 包括一般的函数, 甚至是任何接受T类型隐式转换参数的函数, 还可以匹配重载了( )操作符的类(仿函数). 以及运用lambda表达式.

比如说.
Test(str, strcmp);
Test(str, std::max);
Test(str, std::swap);

虽然这三个函数的声明都不一样, 但是全部可以匹配Func.
匿名用户
2012-09-04
展开全部
你的T的推导类型是char[2][5],而不是你希望的char *;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友64de9a1
2012-09-04
知道答主
回答量:9
采纳率:0%
帮助的人:6.9万
展开全部
#include<stdio.h>
#include<string.h>
template <class T>
void Test( T arr[] , int a )
{
}
void main()
{
char str[2][5] = { "bbb" , "aaa" } ;
Test( str , strcmp(str[0],str[1]) );
}
strcmp()返回就是int型了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式