шаблон конструктор - PullRequest
       32

шаблон конструктор

0 голосов
/ 05 марта 2020

По сути, я кодирую класс Matrix, но я хочу создать его экземпляр с int[N][M] переменными.

У меня это работает (для матрицы 3, 3):
matrix.h:

class Matrix {
    private:
        unsigned cols, rows;
        int* data;
    public:
        Matrix(unsigned cols, unsigned row);
        Matrix(int mat[3][3]);
}

matrix. cpp:

inline
Matrix::Matrix(unsigned cols, unsigned rows) : cols (cols), rows (rows) {
    if (rows == 0 || cols == 0) {
        throw std::out_of_range("Matrix constructor has 0 size");
    }
    data = new int[rows * cols];
}

Matrix::Matrix(int mat[3][3]) : Matrix(3, 3) {
    for(unsigned row = 0; row < rows; row++) {
        for(unsigned col = 0; col < cols; col++) {
            (*this)(col, row) = mat[col][row];
        }
    }
}

Затем я попытался реализовать конструктор шаблона:

template<int N, int M>
Matrix(int[N][M]) : Matrix(N, M) {
    for(unsigned row = 0; row < rows; row++) {
        for(unsigned col = 0; col < cols; col++) {
            (*this)(col, row) = mat[col][row];
        }
    }
}

, который, кажется, компилируется, но когда я выполнить тестовую функцию:

void test() {
    int tab[3][3] = {
        {1,2,3},
        {4,5,6},
        {7,8,9}
    };
    Matrix mat(tab);
}

Я получаю эту ошибку:

matrix.cpp:10:19: error: no matching function for call to ‘Matrix::Matrix(int [3][3])’
     Matrix mat(tab);

, даже если я шаблонирую ее таким образом (в файле .h в классе Matrix):

template<> Matrix::Matrix<3, 3>(int[3][3]);

Я мог бы действительно использовать некоторую помощь по этому вопросу, а также о том, как создать экземпляр для каждой комбинации int от 0 до 10

.

1 Ответ

4 голосов
/ 05 марта 2020

Пара вещей ...

Первое замечание: Matrix(int[N][M]) не является полным и отсутствует имя аргумента. Также обратите внимание, что это эквивалентно Matrix(int(*)[M]).

Во-вторых, размеры массива имеют тип size_t, а не int.

В-третьих, для передачи фактического массива, а не указателя, вам нужно взять массив по ссылке.

Собрав все вместе, ваш конструктор, вероятно, должен выглядеть примерно так:

template<size_t N, size_t M>
Matrix(int const (&mat)[N][M]) : Matrix(N, M)
{
    for (size_t n = 0; n < N; ++n)
    {
        for (size_t m = 0; m < m; ++m)
        {
            (*this)(n, m) = mat[n][m];
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...