error: no match for 'operator<<' in 'std::cout << SparseMatrix::Add(SparseMatrix&)(((SparseMatrix&)(&B)))'

jay603 发布于 2012/12/12 16:02
阅读 2K+
收藏 0
#include<iostream>
using namespace std;

const int DefaultSize=100;

struct Triple
{
    int row,col;
    int value;
};

class SparseMatrix
{
    friend ostream& operator << (ostream& out,SparseMatrix& M);
    friend istream& operator >> (istream& in,SparseMatrix& M);
    private:
    int Rows,Cols,Terms;
    Triple *MatrixArray;
    int maxTerms;
    public:
    SparseMatrix(int maxSz=DefaultSize);
    SparseMatrix(SparseMatrix& x);
    ~SparseMatrix(){
        delete[] MatrixArray;
    };
    SparseMatrix Add(SparseMatrix& b);
};


SparseMatrix::SparseMatrix(int maxSz):maxTerms(maxSz)
{
  if(maxSz<1)
    {
      cerr << "矩阵初始化错误!" << endl;
      exit(1);
    }
  MatrixArray=new Triple[maxSz];
  if(MatrixArray==NULL)
    {
      cerr << "内存分配错误" << endl;
      exit(1);
    }
  Rows=Cols=Terms=0;
}

SparseMatrix::SparseMatrix(SparseMatrix& x)
{
  Rows=x.Rows;
  Cols=x.Cols;
  Terms=x.Terms;
  maxTerms=x.maxTerms;
  MatrixArray=new Triple[maxTerms];
  if(MatrixArray==NULL)
    {
      cerr << "内存分配错误!" << endl;
      exit(1);
    }
  for(int i=0;i<Terms;i++)
    MatrixArray[i]=x.MatrixArray[i];
}

ostream &operator << (ostream& out,SparseMatrix& M)
{
  out << "rows=" << M.Rows << endl;
  out << "cols" << M.Cols << endl;
  out << "Nonzero terms =" << M.Terms << endl;
  for(int i=0;i<M.Terms;i++)
    out << "M[" << M.MatrixArray[i].row << "][" << M.MatrixArray[i].col <<"]=" << M.MatrixArray[i].value << endl;
  return out;
}

istream& operator >> (istream& in,SparseMatrix& M)
{
  cout << "请输入稀疏矩阵的行数、列数及项数:" << endl;
  in >> M.Rows >> M.Cols >> M.Terms ;
  if(M.Terms>M.maxTerms)
    {
      cerr << "项数太多!" << endl;
      exit(1);
    }
  for(int i=0;i<M.Terms;i++)
    {
      cout << "请输入项的行数、列数及其值:" << i+1 << endl;
      in >> M.MatrixArray[i].row >> M.MatrixArray[i].col >> M.MatrixArray[i].value;
    }
  return in;
}

SparseMatrix SparseMatrix::Add(SparseMatrix& b)
{
  SparseMatrix result(b);
  if(Rows!=b.Rows || Cols!=b.Cols)
    {
      cerr << "两矩阵规格不相同" << endl;
      return result;
    }
  int i=0,j=0,index_a,index_b;
  result.Terms=0;
  while(i<Terms && j<b.Terms)
    {
      index_a=Cols*MatrixArray[i].row+MatrixArray[i].col;
      index_b=Cols*b.MatrixArray[i].row+b.MatrixArray[i].col;
      if(index_a>index_b)
     {
      result.MatrixArray[result.Terms]=b.MatrixArray[j];
      j++;
     }
      else if(index_a<index_b)
     {
      result.MatrixArray[result.Terms]=MatrixArray[i];
      i++;
     }
      else
     {
        result.MatrixArray[result.Terms]=MatrixArray[i];
        result.MatrixArray[result.Terms].value=MatrixArray[i].value+b.MatrixArray[j].value;
        if(result.MatrixArray[result.Terms].value==0)
            result.Terms--;
        i++;j++;
     }
     result.Terms++;
    }
    return result;
}

int main()
{
    SparseMatrix A;
    cin>> A;
    SparseMatrix B;
    cin>> B ;
    cout<<A.Add(B) ;
    return 0;
}

最后出现这个问题:no match for 'operator<<' in 'std::cout << SparseMatrix::Add(SparseMatrix&)(((SparseMatrix&)(&B)))'

求高手解答
加载中
0
sToa
sToa
vc6编译通过
返回顶部
顶部