Возврат присваиваемого значения для std :: map () с использованием оператора overloaded [] - PullRequest
0 голосов
/ 23 января 2020

Я бы хотел вставить данные в мой класс Matrix, используя оператор []. Аргумент этого оператора, 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;
}

Я не могу вернуть ссылку на карту так, чтобы ее можно было назначить и продолжаю получать следующую ошибку:

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];

Я заработал, когда возвращал указатель на data[x], разыменовывал это и присваивал значение этому. Это не доставляет аккуратный код, и я думаю, что это можно сделать проще. Так чего мне здесь не хватает?

1 Ответ

1 голос
/ 23 января 2020

Если у вас есть карта:

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

, тогда key_type равно std::array<int,2>, а mapped_type равно T. operator[] берет ключ и возвращает ссылку на соответствующее значение.

Одним из правильных способов будет

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];
}
...