C++传入排序函数作为checkSortTime参数触发C2664错误求解
错误原因
- 报错核心是函数指针返回值类型不匹配:你定义的
checkSortTime模板第一个参数要求传入返回值为T类型的函数指针,但你传入的selectionSort等排序函数是无返回值(void)的,二者类型不一致触发类型转换失败。 - 对比可正常运行的搜索耗时测试:搜索算法(二分、线性搜索等)本身需要返回找到的索引/目标值,返回值为
T类型,和checkSearchTime定义的函数指针返回值匹配,所以不会报错;而排序算法都是直接修改入参数组,不需要返回值,所以不匹配你当前checkSortTime的函数指针定义。
解决方法
直接修改checkSortTime的函数指针参数返回值为void即可,修改后的代码如下:
template<typename T> // 仅需要把原来的T(*funcPointer)改成void(*funcPointer)即可 void checkSortTime(void(*funcPointer)(T myArray[],int size), T arrayArgument[], int sizeArgument) { // 原有计时逻辑无需修改 auto start = std::chrono::high_resolution_clock::now(); funcPointer(arrayArgument, sizeArgument); auto stop = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(stop - start); std::cout << "[" << duration.count() << "] 纳秒" << std::endl; }
如果需要更通用的耗时测试方法,兼容不同返回值、不同参数列表的函数,也可以使用C++11及以上支持的auto推导参数类型结合完美转发实现,不用手动定义函数指针类型。
内容的提问来源于stack exchange,提问作者user13800925
相关产品推荐
相关产品推荐

