Массив как ключ карты - PullRequest
       28

Массив как ключ карты

2 голосов
/ 04 февраля 2020

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

В экземпляре 'T & Matrix :: operator [] (std :: array ) [with T = double] ': 35:12: требуется отсюда 20:24: ошибка: нет совпадения для вызова' (std :: map, double, std :: less>, std :: allocator, double>> >) (const std :: array &) 'матрица возврата (индекс);

Вот как выглядит мой код:

#include <map>

template <typename T>
struct Matrix{
    std::map<std::array<int,2>,T> matrix;
    int rows;
    int columns;

    Matrix()
    : rows(0),
      columns(0)
    {  }

    Matrix(int rows,int columns)
    :  rows(rows),
    columns(columns)
    { }

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

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

};

int main(int argc, char *argv[])
{
    Matrix<double> M(10,10);
    double a = 10;
    M[{10,11}] = a;


    return 0;
}

Ответы [ 3 ]

2 голосов
/ 04 февраля 2020

Как и в сообщении об ошибке, проблема здесь:

    return matrix(index);

Должно быть:

    return matrix[index];

Обратите внимание на оператор [].

Также matrix[index] не может быть вызван в контексте const, поскольку в C ++ map::operator[] создает недостающие элементы, и поэтому является потенциально мутирующей операцией. Я бы переосмыслил ваш дизайн, иначе будет несоответствие между тем, как ваши неконстантные [] и const [] ведут себя по отношению к отсутствующим ключам.

Примечание: вам также следует #include <array>.


PS Оператор сравнения для std::array предоставляется .

2 голосов
/ 04 февраля 2020

В этих операторах

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

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

вы пытаетесь вызвать несуществующую операторную функцию шаблона класса std :: map

matrix(index)

Очевидно, что вы имеете в виду в первый оператор индекса

matrix[index]

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

и второй оператор индекса функции-члена в.

const T& operator[](const std::array<int,2>& index) const{
return matrix.at(index);
}

Также должен быть объявлен второй оператор с возвращаемым типом, квалифицированным с квалификатором const, который является он должен возвращать постоянную ссылку, потому что функция-член в свою очередь является постоянной функцией.

1 голос
/ 04 февраля 2020

В вашем коде есть некоторые проблемы:

  • отсутствует включение для array (работает с g cc, но не с clang)
  • использование оператора пропущенного вызова
  • использование копий вместо константных ссылок
#include <array> // Added include
#include <map>

template <typename T>
struct Matrix{
    std::map<std::array<int,2>,T> matrix;
    int rows;
    int columns;

    Matrix()
    : rows(0),
      columns(0)
    {  }

    Matrix(int rows,int columns)
    :  rows(rows),
    columns(columns)
    { }

    T& operator[](const std::array<int,2> &index){
        return matrix[index]; // replace call operator
    }

    const T& operator[](const std::array<int,2> &index) const{ //return const reference
        return matrix.at(index); // replace call operator
    }

};

int main(int argc, char *argv[])
{
    Matrix<double> M(10,10);
    double a = 10;
    M[{10,11}] = a;


    return 0;
}
...