C ++模板>>和<<超载麻烦

时间:2013-05-02 01:27:14

标签: c++ templates operator-overloading

好的,我正在尝试编写一个构建2D矩阵的模板,我想要>>和<<正常工作,这是我到目前为止的代码,但我迷路了。我有函数输入和输出来通过填写模板来运行用户,所以我希望能够cin和cout模板。

#include <iostream>
#include <cstdlib>

using namespace std;

template <typename T  > 
class Matrix
{
    friend ostream &operator<<(ostream& os,const Matrix& mat);
    friend istream &operator>>(istream& is,const Matrix& mat);
    private:
        int R; // row
        int C; // column
        T *m;  // pointer to T
  public:
   T &operator()(int r, int c){ return m[r+c*R];}
   T &operator()(T a){for(int x=0;x<a.R;x++){
    for(int z=0;z<a.C;z++){
        m(x,z)=a(x,z);
    }   
   }
   }
   ~Matrix();
   Matrix(int R0, int C0){ R=R0; C=C0; m=new T[R*C]; }
   void input(){
       int temp;
       for(int x=0;x<m.R;x++){
           for(int y=0;y<m.C;y++){
               cout<<x<<","<<y<<"- ";
               cin>>temp;
               m(x,y)=temp;
           }
       }
   }
 };

// istream &operator>>(istream& is,const Matrix& mat){
//     is>>mat 
// };

ostream &operator<<(ostream& os,const Matrix& mat){
     for(int x=0;x<mat.R;x++){
         for(int y=0;y<mat.C;y++){
             cout<<"("<<x<<","<<y<<")"<<"="<<mat.operator ()(x,y);
         }

     }
 };

int main()
{
        Matrix<double> a(3,3);
        a.input();
        Matrix<double> b(a);
        cout<<b;

        cout << a(1,1);
}

1 个答案:

答案 0 :(得分:0)

以下是我在代码中发现的所有问题。让我们从头开始:

  • 错误的函数返回类型和this分配

    T operator>>(int c)
    {
        this = c;
    }
    

    为什么这段代码错了?我注意到的第一件事是你的函数正在返回T但你在块中没有返回语句。忘记我在评论中所说的内容,你的插入/运算操作符应该返回*this。因此,您的返回类型应为Maxtrix&

    我在此代码段中看到的另一个错误是您正在分配this指针。这不应该为你编译。相反,如果您打算更改某个数据成员(最好是您的C数据成员),它应该是这样的:

    this->C = c;
    

    反过来,这就是你的功能应该是这样的:

    Matrix& operator>>(int c)
    {
        this->C = c;
        return *this;
    }
    
  • <强> this->(z, x)

    output函数的内部for循环中,您执行了此操作:

    cout << "(" << z << "," << x << ")" << "=" << this->(z, x) << endl;
    

    this->(z, x)没有按你的想法行事。它不会同时访问矩阵的两个数据成员。由于语法无效,它实际上会导致错误。您必须单独访问数据成员,如下所示:

    ... << this->z << this->x << endl;
    

    此外,此output函数不需要返回类型。只需将其void

    请注意,您的input功能存在同样的问题。