* 使用模板重载运算符 class

* operator overloading with template class

尝试通过使用 class 的重载 * 运算符实现矩阵乘法 templates.The 代码在 Windows 中的 CodeBlocks(带有一些警告)上工作,但在 [=22 中通过 g++ 编译时=] 它显示一些 issues.Furthurmore 运行 './a.out' 产生分段错误。

#include <iostream>
#define TOLERANCE 0.0001

using namespace std;

template <class T>class Matrix;
template <class T>ostream &operator<<(ostream &out,const Matrix<T>&);
//Matrix can be of any data type
template <class T> Matrix<T> &operator*( Matrix<T>&);
template <class T>
class Matrix{
    private:
        int rows,columns;
        T **A;
    public:
        //Default Constructor
        Matrix(){rows=0;columns=0;}
        //Parameterised Constructor
        Matrix(int Rows,int Cols){
        rows=Rows;
        columns=Cols;
        A=new T*[rows];
        for(int i=0; i<rows; i++)
            A[i]=new T[columns];
        }
        void displayMatrix();
        void fillMatrix(T x);
        Matrix<T>& operator* ( Matrix<T> &X);//Matrix Multiply
        friend ostream &operator<< <T>(ostream &out ,const Matrix<T> &X);

};
template <class T>
void Matrix<T>::displayMatrix(){
    for(int i=0;i<rows ;i++ ){
        for(int j=0 ;j<columns ;j++ )
            cout<<A[i][j]<<" ";
        cout<<endl;
        }
    }

template <class T>
void Matrix<T>::fillMatrix(T x){
    for(int i=0; i<rows; i++)
        for(int j=0; j<columns; j++)
            A[i][j]=x;
}

template <class T>
Matrix<T> &Matrix<T>::operator*(  Matrix<T> &X){
    T sum=0;
    if(columns=X.rows){
        Matrix<T> Q(rows,X.columns);
        for(int i=0; i<rows ;i++){
            for(int j=0; j<X.columns; j++){
                for(int k=0 ;k<columns ;k++ )
                    sum+=A[i][k]*(X.A[k][j]);
                Q.A[i][j]=sum;
                sum=0;
                }
            }
            return Q;
        }else{
        cout<<"Something's wrong!";
        return *this;
        }
    }

int main(){
Matrix<double> x,y,z;
x.fillMatrix(1.2);
y.fillMatrix(2.3);
z=x*y;
z.displayMatrix();
return 0;
}

我想在cpp中实现广义模板的矩阵乘法。 这会产生以下结果:

myProj.cpp: In instantiation of ‘Matrix& Matrix::operator*(Matrix&) [with T = int]’: myProj.cpp:75:5: required from here myProj.cpp:52:13: warning: reference to local variable ‘Q’ returned [-Wreturn-local-addr] Matrix Q(rows,X.columns);

局部变量或嵌套作用域中的变量一旦超出作用域就会消失。例如,在您的 operator* 函数中,您有局部变量 Q。当你从函数中 return 时,变量不再存在,并且 Q 对象将被破坏。返回对它的引用将导致未定义的行为

这里的问题实际上不是 returning Q,而是你 return 通过引用 。解决方法是returnby valueoperator+重载函数也是一样,按值也应该是return。

按值返回当然需要您遵循 the rules of three, five or zero,您现在不需要这样做,因为您没有任何赋值运算符、复制或移动构造函数,甚至没有析构函数(最后会导致内存泄漏)。