关于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 );
} 展开
#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 );
} 展开
3个回答
展开全部
写成
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里面尽是这些.
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 *;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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型了
#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型了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询