0

わかりましたので、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);
}
4

1 に答える 1

0

これが私があなたのコードで見つけたすべての問題です。最初から始めましょう:

  • 関数の戻り値の型と代入が間違っていますthis

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

    このコードが間違っているのはなぜですか? 最初に気付いたのは、関数が返さTれているにもかかわらず、ブロックに return ステートメントが存在しないことです。コメントで言ったことは忘れてください。挿入/実行演算子は を返す必要があり*thisます。したがって、戻り値の型は にする必要がありますMaxtrix&

    このスニペットで見られるもう 1 つのエラーは、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)あなたが思うように行動していません。マトリックスの 2 つのデータ メンバーに同時にアクセスすることはありません。無効な構文のため、実際にはエラーが発生します。次のように、データ メンバーに個別にアクセスする必要があります。

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

    さらに、このoutput関数は戻り型を必要としません。作るだけvoid

    関数にも同じ問題があることに注意してくださいinput

于 2013-05-02T01:58:01.020 に答える