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

C++如何编写支持2/3模板参数的multimap_util工具类

问题解决方法

错误原因

你遇到的编译错误核心原因是当前定义的multimap_util模板强制要求传入3个类型参数,未给第三个比较器参数设置默认值,因此仅传2个参数的调用场景无法通过编译。

解决方案

不需要用模板偏特化或者子类继承,给第三个模板参数设置默认值即可满足需求,全程没有用到可变参数模板,符合你的限制要求:

  1. 将第三个模板参数的默认值指定为std::multimap默认使用的比较器std::less<T1>,既支持传2个参数的默认排序场景,也支持传3个参数的自定义排序场景
  2. 合并冗余的构造函数,当模板参数C使用默认值时,std::multimap<T1, T2, C>就等价于默认排序的std::multimap<T1, T2>,不需要单独写两个重载

修改后的完整代码

#include <map>
#include <functional> // 引入std::less头文件

template <typename T1, typename T2, typename C = std::less<T1>>
class multimap_util
{
        std::multimap<T1, T2, C>* map;
        
    public:
        explicit multimap_util(std::multimap<T1,T2,C>& map) : map(&map)
        {};
        
        // 你原来的其他工具方法可以直接保留在这里
};

两种使用场景验证

默认排序场景

std::multimap<int, int> m;
multimap_util<int, int> mu( m ); // 自动使用默认的std::less<int>作为第三个参数,编译通过

自定义排序场景

// 自定义比较器示例
struct string_size_more {
    bool operator()(const std::string& a, const std::string& b) const {
        return a.size() > b.size();
    }
};

std::multimap<std::string, std::string, string_size_more> lmm;
multimap_util<std::string, std::string, string_size_more> lmmu( lmm ); // 传入自定义比较器,编译通过

内容的提问来源于stack exchange,提问作者Bufer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 13:06:09