如何在模板中编写朋友(操作员)方法?

How to write a friend (operator) method in a template?

所以我试图在模板中重载运算符 + class。 代码编译并运行,但在使用运算符 + 时崩溃。 试了很多东西,我认为这是一个语法问题?任何意见,将不胜感激!

运算符 = 已重载且有效。

Matrix.h

template <int row, int col, class T = int>
class Matrix
{
    int rows;
    int cols;
    T** mat;

public:

    Matrix(int defVal = 0) {
        rows = row;
        cols = col;
        memory();

        for (int i = 0; i < rows; i++)
            for (int j = 0; j < cols; j++)
                mat[i][j] = defVal;
    }
    ~Matrix() {
        del();
    }

    Matrix(const Matrix& other) {
        *this = other;
    }

    const Matrix& operator=(const Matrix& other) {
        if (&other != this)
        {   
            rows = other.rows;
            cols = other.cols;
            del();
            memory();
            for (int i = 0; i < rows; i++)
                for (int j = 0; j < cols; j++)
                    mat[i][j] = other.mat[i][j];
        }
        return *this;
    }

    friend ostream& operator<<(ostream& os, const Matrix& m) {

        for (int i = 0; i < m.cols; i++)
        {
            for (int j = 0; j < m.rows; j++)
                os << m.mat[i][j] << " ";
            os << endl;
        }
        return os;
    }

    friend Matrix operator+(const Matrix& other, T num) {

        Matrix temp = other;

        for (int i = 0; i < temp.rows; i++)
            for (int j = 0; j < temp.cols; j++)
                temp.mat[i][j] += num;
        return temp;
    }

    void memory(){
        mat = new T * [rows];
        for (int i = 0; i < rows; i++)
            mat[i] = new T[cols];
    }

    void del(){
        for (int i = 0; i < rows; i++)
            delete[] mat[i];
        delete[] mat;
    }
};

main.cpp

int main() {

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

    Matrix<4, 4> identity(1);

    std::cout << identity + 3 << std::endl; //crashes here

return 0;
}

如果您需要代码的其他部分,请告诉我!提前致谢!

您的复制构造函数和赋值看起来很可疑,您 del 在更改 rowscols 之后,没有初始化任何东西。 我希望它应该是

Matrix(const Matrix& other) : rows(0), cols(0), mat(nullptr) {
    *this = other;
}

const Matrix& operator=(const Matrix& other) {
    if (&other != this)
    {   
        del(); // clean up first
        rows = other.rows;
        cols = other.cols;
        memory();
        for (int i = 0; i < rows; i++)
            for (int j = 0; j < cols; j++)
                mat[i][j] = other.mat[i][j];
    }
    return *this;
}

顺便说一句,我根本不会在这里使用动态分配,而是

template <typename T, size_t rows, size_t cols>
class Matrix
{
    std::array<std::array<T, cols>, rows> mat;
public:
    Matrix(T defVal = {}) {
        for (int i = 0; i < rows; i++)
            for (int j = 0; j < cols; j++)
                mat[i][j] = defVal;
    }

    friend std::ostream& operator<<(std::ostream& os, const Matrix& m) {
        for (int i = 0; i < cols; i++)
        {
            for (int j = 0; j < rows; j++)
                os << m.mat[i][j] << " ";
            os << std::endl;
        }
        return os;
    }

    friend Matrix operator+(Matrix other, T num) {
        for (int i = 0; i < rows; i++)
            for (int j = 0; j < cols; j++)
                other.mat[i][j] += num;
        return other;
    }

    // No need for any special members
};