You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用模板化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:24:04