使用重载的 [] 运算符返回 std::map() 的可分配值

Returning assignable value for std::map() using overloaded [] operator

我想使用 [] 运算符在我的 Matrix class 中插入数据。此运算符的参数 std::array<int, 2>std::map.

的键
template <typename T>
class Matrix
{
public:
    Matrix(const int& rows, const int& cols)
    : rows(rows), cols(cols)
    {}

    std::map<std::array<int, 2>, T>& operator[] (std::array<int, 2> x) {
        return data[x];
    }

private:
    std::map<std::array<int, 2>, T> data;
    const int rows;
    const int cols;
};
int main()
{

    Matrix<double> M(10, 10);

    M[{10, 10}] = (double) 10;

    return 0;
}

我无法 return 以可分配的方式引用地图,并不断收到以下错误:

error: non-const lvalue reference to type 'std::map<std::array<int, 2>, double>' cannot bind
      to a value of unrelated type 'std::__1::map<std::__1::array<int, 2>, double,
      std::__1::less<std::__1::array<int, 2> >, std::__1::allocator<std::__1::pair<const std::__1::array<int, 2>,
      double> > >::mapped_type' (aka 'double')
        return data[x];

当 return 指向 data[x] 的指针时,我得到它的工作,取消引用它并为其分配一个值。这不会提供整洁的代码,我认为它可以更容易地完成。那么我在这里缺少什么?

如果你有地图:

std::map<std::array<int, 2>, T>

那么它的key_type就是std::array<int,2>mapped_type就是Toperator[] 取一个键,returns 取一个对应值的引用。

一个正确的方法是

T& operator[] (const std::array<int, 2>& x) {
    return data[x];
}

或者如果你真的想要 T 作为键和数组作为值你更需要一个

std::map<T, std::array<int, 2>>

方法可以是

std::array<int,2>& operator[] (const T& x) {
    return data[x];
}