使用模板化qsort排序对象指针数组时出现C2227编译错误的原因是什么
错误原因
- 核心错误出在你调用
compare模板时传递的实参类型不对:你写的是compare<my_type*>,此时模板参数a_type会被推导为my_type*类型 - 代入
compare函数的实现后,a_type* a等价于my_type** a,而你通过(*(a_type**)pa)解引用后得到的是my_type*类型,赋值给二级指针a后,a->name本质是用二级指针访问类成员,自然不符合语法规则,触发C2227报错 - 额外存在的小问题:
qsort的第二个参数是待排序元素总数,你传了n-1会导致最后一个元素不参与排序
修复方案
你只需要修改qsort调用行的模板参数即可,修改后代码如下:
// 把 compare<my_type*> 改为 compare<my_type>,同时把第二个参数n-1改为n qsort(a, n, sizeof(a[0]), compare<my_type>);
修改后模板参数a_type为my_type,此时:
a_type* a等价于my_type* a(*(a_type**)pa)解引用后得到的就是my_type*类型,赋值后a->name可以正常访问类的name成员
补充说明
C++场景下更推荐使用标准库的std::sort完成排序操作,相比C语言的qsort具备编译期类型检查能力,不容易出现这类类型匹配错误,用法也更简洁。
内容的提问来源于stack exchange,提问作者Mihai Oltean
相关产品推荐
相关产品推荐

