#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
.
Мне также пришлось немного изменить конструктор, но я до сих пор не знаю, почему он жаловался.