*运算符重载模板类

时间:2016-04-12 07:16:45

标签: c++ templates matrix g++ operator-keyword

尝试通过带有类模板的重载*运算符来实现矩阵乘法。代码适用于Windows中的CodeBlocks(带有一些警告),但是在Ubuntu中通过g ++进行编译时,它显示了一些问题。更多运行' ./的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:实例化'Matrix&amp; Matrix :: operator *(Matrix&amp;)[with T = int]':   myProj.cpp:75:5:从这里需要   myProj.cpp:52:13:警告:引用本地变量'Q'返回[-Wreturn-local-addr]      矩阵Q(行,X.columns);

1 个答案:

答案 0 :(得分:2)

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

此处的问题实际上并未返回Q,而是通过引用返回。解决方案是按值返回 。对于operator+重载函数,它也是一样的,它也应该按值返回。

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