Оператор <

#c #operator-overloading #operators

Вопрос:

У меня есть некоторый код, который должен перегружать оператора < Вот код для этого: (файл Matirx.h)

 #pragma once
#include <iostream>

using std::cout;
using std::endl;
using std::ostream;

template <int N=1, int M=1, class T = int>
class Matrix {
    int rows;
    int cols;
    T matrix[N][M];
public:

Matrix(T matrixVal = 0) :rows(N), cols(M) {
    for (int i = 0; i < rows; i  ) {
        for (int j = 0; j < cols; j  ) {
            this->matrix[i][j] = matrixVal;
        }
    }
}

int getRows() { return rows; }
int getCols() { return cols; }
T** getMatrix() { return matrix; }

friend ostreamamp; operator<<(ostreamamp; out, const Matrix<>amp; mat) {
    for (int i = 0; i < rows; i  ) {
        for (int j = 0; j < cols; j  ) {
            out << this->matrix[i][j];
            out << " ";
        }
        out << endl;
    }
    return out;
}
 

Но когда я добавляю его, я получаю эти ошибки:

Ошибка C2084 функция «std::ostream amp;Матрица<4,4,int>::оператор <4,4,int><<(std::ostream amp;,Матрица констант<1,1,int> amp;)» уже имеет тело

Ошибка C2679 двоичный файл ‘<<‘: не найден оператор,который принимает правый операнд типа ‘Матрица<4,4, int>’ (или нет приемлемого преобразования)

Ошибка (активна) E0349 нет оператора «<

вот основной код:

 #include "matrix.h"

template <int row, int col, typename T>
void printDiag(Matrix<row, col, T>amp; mat) {
    int number;
    T* diag = mat.getDiag(number);
    for (int i = 0; i < number; i  )
    {
    std::cout << diag[i] << " ";
   }
   std::cout << std::endl;
   delete[] diag;
}

int main() {

//freopen("output_matrix.txt", "w", stdout);

Matrix<4, 4> mat;
std::cout << mat << std::endl;

Matrix<4, 4> identity(1);
std::cout << identity << std::endl;
 

любая помощь будет признательна (:

Комментарии:

1. И в чем же заключается неудача?

2. template <int N, int M, class T> friend ostreamamp; operator<<(ostreamamp; out, const Matrix<N,M,T>amp; mat) скорее?

3. Я попробовал то, что вы предложили @m88, но, похоже, это не работает, появилось больше ошибок, таких как ошибка C2568 ‘

4. @user253751 Я обновил вопрос, извините за это

5. Функция друзей @LeonGurin не является участником. Вы не можете использовать this . В этом случае вам не нужен шаблон, но вы хотели бы указать Matrix<N,M,T> его в объявлении функции. Также вы не можете использовать rows / cols использовать mat.rows и mat.cols

Ответ №1:

С этим связано несколько проблем. Сначала в объявлении необходимо указать аргументы шаблона. Поскольку весь класс является шаблоном, вам не нужно явно добавлять другой template ранее, но вам нужно Matrix<N,M,T> .

Вторая проблема заключается в том, что вы обращаетесь friend std::ostreamamp; operator<<(...) с ней так, как если бы это была функция-член (используя переменные-члены и this ). Это не так. Возможно, вы объявляете его внутри класса, но он определенно не является частью класса. Где вы используете this-> use mat. и где вы просто используете rows / cols используете mat.rows / mat.cols .

Мне также пришлось немного изменить конструктор, но я до сих пор не знаю, почему он жаловался.