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

如何为自定义结构体ProxyMap实现必要运算符以通过编译?

让自定义ProxyMap结构体代码编译的修改方案

当前代码编译失败有明确的原因,对应的修改方案如下:

问题代码

#include <map>
#include <iostream>
#include <tuple>

template <typename T>
struct ProxyMap {
    auto begin() { return m.begin(); }
    auto end() { return m.end(); }
private:
    std::map<size_t, T> m;
};

int main () {
    ProxyMap<int> pm;
    pm[0] = -1;
    pm[3] = 23;
    pm[63] = 0;
    for (auto c : pm) {
        size_t a;
        int b;
        std::tie(a,b) = c;
        std::cout << a << " " << b << "\n";
    }
    return 0;
}

必须的修改:实现operator[]重载

原代码中pm[0] = -1这类下标访问语句,无法找到ProxyMap对应的下标运算符,这是编译失败的核心原因。需要为ProxyMap添加operator[]的重载,内部直接复用成员std::map的下标逻辑:

T& operator[](size_t idx) {
    return m[idx];
}

可选优化:补充const版本的方法

为了让ProxyMap支持const对象的使用场景,可补充以下两个const版本的方法,属于提升可用性的优化项,非编译当前代码的必须项:

  • const版本的下标运算符
  • const版本的begin()/end()迭代器方法
// const版本下标运算符
const T& operator[](size_t idx) const {
    return m[idx];
}

// const版本迭代器方法
auto begin() const { return m.begin(); }
auto end() const { return m.end(); }

修改后的完整代码

#include <map>
#include <iostream>
#include <tuple>

template <typename T>
struct ProxyMap {
    T& operator[](size_t idx) {
        return m[idx];
    }

    const T& operator[](size_t idx) const {
        return m[idx];
    }

    auto begin() { return m.begin(); }
    auto end() { return m.end(); }

    auto begin() const { return m.begin(); }
    auto end() const { return m.end(); }
private:
    std::map<size_t, T> m;
};

int main () {
    ProxyMap<int> pm;
    pm[0] = -1;
    pm[3] = 23;
    pm[63] = 0;
    for (auto c : pm) {
        size_t a;
        int b;
        std::tie(a,b) = c;
        std::cout << a << " " << b << "\n";
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:10:15