如何通过模板传递比较类?编译报错问题排查
问题分析与解决
错误原因
报错的核心问题是:Comp1类的operator()中使用了模板类Info1作为参数类型,但没有指定模板参数。Info1是类模板而非具体类,必须提供模板参数(如Info1<Comp1>)才能作为合法类型使用。
你的代码中Comp1的operator()声明为:
bool operator()(const Info1& a,const Info1& a2) const {
这里的Info1缺少模板参数,编译器无法确定具体指代的类,因此抛出编译错误。
两种修复方案
方案1:让Comp1支持任意符合条件的类型(推荐)
将Comp1的operator()改为模板函数,使其能适配任何带有r成员的类型,通用性更强:
struct Comp1 { template<typename InfoType> bool operator()(const InfoType& a, const InfoType& a2) const { return a.r < a2.r; } };
方案2:明确指定Info1的模板参数
如果仅需Comp1配合Info1<Comp1>使用,可直接在参数中指定完整的模板实例类型:
struct Comp1 { bool operator()(const Info1<Comp1>& a, const Info1<Comp1>& a2) const { return a.r < a2.r; } };
注:这种写法存在循环依赖,但C++允许此类不完整类型的使用,只要实际使用前两个类型均完成定义,代码即可合法编译。
额外优化建议
原代码中Info1的operator<参数为Info1& a2,建议修改为const Info1& a2,保证const正确性:
bool operator<(const Info1& a2) const { return Compare()(*this, a2); }
内容的提问来源于stack exchange,提问作者adrian
相关产品推荐
相关产品推荐

