各位大佬,帮忙看一下是哪儿的问题

yezhibai 2018-04-13 07:31:43
#ifndef CMatrix_H_
#define CMatrix_H_
#include<iostream>
#include<fstream>
#include<vector>
//#define MIN(a,b) ((a)<(b))?(a):(b);
//#include <string>
//#include<math>
using namespace std;
template <class T>
class CMatrix
{
protected:
struct mrep
{
vector<T> **f;//组成矩阵的向量指针
int refcnt;//被引用次数
int length;//矩阵的行数
T **tmppointer;
} *p;
public:
// vector <T> ** begin(){return p->f;};//指向第一个元素的二重指针
vector<T> ** begin() const {return p->f;};
CMatrix();//********************************************默认的构造
CMatrix(int xsize,int ysize,T init=0);//****************构造函数
CMatrix(int xlength,const vector<T> *vec);//************构造函数
CMatrix(CMatrix<T> &x); //*****************************拷贝构造函数
~CMatrix(); //******************************************析构函数
CMatrix<T> & operator=(const CMatrix<T> &mat);//**重载赋值运算符——矩阵赋矩阵
int row() const;//**************************************返回行数
int col() const;//**************************************返回列数
vector<T> & operator []( int i);//***********************重载[]
operator T **();//****************************************重载**
void ReadFromFile();//********************************从文件中读入矩阵
friend CMatrix cpy(CMatrix &v);//**************************拷贝函数
friend std::ostream & operator<<(std::ostream &s,const CMatrix<T> &mat);//重载输出函数
friend std::istream & operator>>(std::istream &s,const CMatrix<T> &mat);//重载输入函数
friend CMatrix<T> operator*(CMatrix<T> &v1,CMatrix<T> &v2);//矩阵乘法

};
//template <class T>
//vector<T> ** CMatrix<T>::begin()
//{return p->f;}
template <class T>//********************************************默认的构造
CMatrix<T>::CMatrix()
{
p=new mrep;
p->length=NULL;
p->f=0;
p->refcnt=1;
p->tmppointer=NULL;
}
template <class T>//********************************************构造函数可扩展

CMatrix<T>::CMatrix(int xsize,int ysize,T init)
{
if(xsize<=0||ysize<=0) cout<<"error!!";
p=new mrep;
p->length=xsize;
p->f=new vector<T> *[xsize];
for(int i(0);i<xsize;i++)
p->f[i]=new vector<T>(ysize,init);

p->refcnt=1;
p->tmppointer=NULL;
}
template <class T>//********************************************构造函数
CMatrix<T>::CMatrix(int xlength,const vector<T> *vec)
{
if(xlength<=0) cout<<"error!!";
p=new mrep;
p->length=xlength;
p->f=new vector<T> *[xlength];
for(int i=0;i<xlength;i++)
p->f[i]=new vector<T>(*vec);
}
template <class T>//********************************************拷贝的构造函数

CMatrix<T>::CMatrix(CMatrix<T> &x)
{
x.p->refcnt++;
p=x.p;
}
template <class T>
CMatrix<T> cpy(CMatrix<T> &v)
{

int mr=v.row();
int mc=v.col();
CMatrix<T> x(mr,mc);
for(int i(0);i<mr;i++)
*(x.p->f[i])=*(v.p->f[i]);
return x;
}

template <class T>//********************************************
CMatrix<T>::~CMatrix()//****************************************析构函数
{
if(--p->refcnt==0)
{
if(p->f!=NULL)
{
int len=p->length;
for(int i(0);i<len;i++)
delete p->f[i];
if(p->tmppointer!=NULL)
delete p->tmppointer;
delete p->f;
}
}
}
template <class T>
int CMatrix<T>::row() const//***********************************返回行数
{
return p->length;
}
template <class T>
int CMatrix<T>::col() const//***********************************返回列数
{

return p->f[0]->size();
}

template <class T>
CMatrix<T> & CMatrix<T>::operator=(const CMatrix<T> &vec)//*****重载赋值操作符号
{
vec.p->refcnt++;
if(--p->refcnt==0)
{
int len=p->length;
for(int i(0);i<len;i++)
delete p->f[i];
delete p->f;
if(p->tmppointer!=NULL)
delete p->tmppointer;
delete p;
}
p=vec.p;
return *this;
}
template <class T>//********************************************重载[]
vector<T> &CMatrix<T>::operator[](int i)
{
if((i>=0)&&(i<p->length))
return *p->f[i];
else{
cout<<"error"<<endl;
return *p->f[0];
}
}
template<class T>//*********************************************重载**
CMatrix<T>::operator T **()
{
if(p->tmppointer==NULL)
{
int n=row();
p->tmppointer=new T *[n];
for(int i(0);i<n;i++)
p->tmppointer[i]=p->f[i]->begin();
}
return p->tmppointer;
}
template <class T>
void CMatrix<T>::ReadFromFile()//******************************从文件中读入矩阵

{
char filename[256];
cin>>filename;
ifstream infile;
// cout<<"****";
int row,col;
infile.open(filename,ios::in);
if(!infile)
{
cout<<"不能打开输入文件!"<<endl;
exit(1);
};
infile>>row>>col;
CMatrix<T> v1(row,col,0);
// infile>>v1[0][0];
// cout<<v1[0][0]<<"*****"<<endl;
for(int i(0);i<row;i++)
for(int j(0);j<col;j++)
infile>>v1[i][j];
*this=v1;

}
template <class T>
std::ostream & operator<<(std::ostream & os,CMatrix<T> &v1)//**输出重载
{
// os<<"{"<<endl;
vector<T> **f=v1.begin();
// cout<<v1.begin()<<"*&*"<<endl;
int len=v1.row();
for(int i(0);i<len;i++)
os<<f[i]<"\n";

return os;
}
template <class T>
std::istream & operator>>(std::istream & is,CMatrix<T> &v1)//**输入重载
{
int row,col;
cout<<"请输入矩阵的行数和列数:\n";
is>>row>>col;
CMatrix<T> x(row,col,0);
cout<<"请输入"<<row<<'*'<<col<<"矩阵\n";
for(int i(0);i<row;i++)
for(int j(0);j<col;j++)
is>>x[i][j];
v1=x;
return is;
}
template <class T>
CMatrix<T> operator*(CMatrix<T> &m1,CMatrix<T> &m2)//*********矩阵乘法
{
int i,j,k;
int m1rows=m1.row();
int m1cols=m1.col();
int m2rows=m2.row();
int m2cols=m2.col();
if(m1cols!=m2rows)
cout<<"error!"<<endl;
CMatrix<T> v(m1rows,m2cols);
CMatrix<T> flip(m2cols,m2rows);
for(i=0;i<m2rows;i++)
for(j=0;j<m2cols;j++)
flip[j][i]=m2[i][j];
for(i=0;i<m1rows;i++)
for(j=0;j<m2cols;j++)
for(k=0;k,m2cols;k++)
v[i][j]=m1[i][k]*flip[k][j];
return v;
}
...全文
842 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Isnis-fallen 2018-04-15
  • 打赏
  • 举报
回复
需要定义操作符 <<
yezhibai 2018-04-13
  • 打赏
  • 举报
回复
:\Users\admin\Desktop\Cpp2.cpp(207) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::vector<int,class std::allocator<int> >' (or there is no acceptable conversion) C:\Users\admin\Desktop\Cpp2.cpp(285) : see reference to function template instantiation 'class std::basic_ostream<char,struct std::char_traits<char> > &__cdecl operator <<(class std::basic_ostream<char,struct std::char_traits<char> > &,class CMatrix<int> &)' being compiled C:\Users\admin\Desktop\Cpp2.cpp(207) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::vector<double,class std::allocator<double> >' (or there is no acceptable conversion) C:\Users\admin\Desktop\Cpp2.cpp(285) : see reference to function template instantiation 'class std::basic_ostream<char,struct std::char_traits<char> > &__cdecl operator <<(class std::basic_ostream<char,struct std::char_traits<char> > &,class CMatrix<double> &)' being compiled 执行 cl.exe 时出错.
吴瀚 2018-04-13
  • 打赏
  • 举报
回复
楼主不妨发一下报错的信息

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧