今天,在写学校布置的实验报告时,遇到了一个莫名其妙的报错
[Error] no match for ‘operator<<‘ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘XXX’)
源码如下:
#include <iostream>
using namespace std;
class Matrix{
public:
Matrix(){}
Matrix(int a,int b,int c,int d,int e,int f)
{
matrix[0][0]=a;
matrix[0][1]=b;
matrix[0][2]=c;
matrix[1][0]=d;
matrix[1][1]=e;
matrix[1][2]=f;
}
friend ostream &operator<<(ostream &,Matrix &);
friend istream &operator>>(istream &,Matrix &);
friend Matrix operator+(Matrix &x,Matrix &y);
friend Matrix operator*(int,Matrix &);
Matrix operator*(int);
Matrix operator++();
Matrix operator++(int);
void show();
private:
int matrix[2][3]={{0,0,0},{0,0,0}};
};
Matrix operator+(Matrix &x,Matrix &y){
Matrix z;
for(int i=0;i<2;i++){
for(int w=0;w<3;w++){
z.matrix[i][w]=x.matrix[i][w]+y.matrix[i][w];
}
}
return z;
}
istream &operator>>(istream &input,Matrix &m){
for(int i=0;i<2;i++){
for(int w=0;w<3;w++){
input>>m.matrix[i][w];
}
}
return input;
}
ostream &operator<<(ostream &output,Matrix &m){
for(int i=0;i<2;i++){
for(int w=0;w<3;w++){
cout<<m.matrix[i][w]<<" ";
}
cout<<endl;
}
return output;
}
Matrix Matrix::operator++(){
for(int i=0;i<2;i++){
for(int w=0;w<3;w++){
++matrix[i][w];
}
}
}
Matrix Matrix::operator++(int){
for(int i=0;i<2;i++){
for(int w=0;w<3;w++){
matrix[i][w]++;
}
}
}
Matrix operator*(int c,Matrix &m){
Matrix z;
for(int i=0;i<2;i++){
for(int w=0;w<3;w++){
z.matrix[i][w]=c*m.matrix[i][w];
}
}
return z;
}
Matrix Matrix::operator*(int x){
Matrix z;
for(int i=0;i<2;i++){
for(int w=0;w<3;w++){
z.matrix[i][w]=x*matrix[i][w];
}
}
return z;
}
int main()
{
Matrix a(1,2,3,4,5,6),b(6,5,4,3,2,1),c,d,e;
int a1=2,a2=3;//用于测试数乘运算时用到的整数
//(1)测试:>>,输入a和b
//a的值如下:
// 1 1 1
// 2 2 2
//b的值如下:
// 3 2 1
// 6 5 4
cout<<"请输入a和b"<<endl;
cin>>a>>b;
cout<<"--------------------------"<<endl;
//(2)测试:<<,输出a和b
//输出结果格式:
//a的值如下:(b与a类似)
// 1 1 1
// 2 2 2
cout<<"a的值如下:"<<endl;
cout<<a<<endl;
cout<<"b的值如下:"<<endl;
cout<<b<<endl;
cout<<"--------------------------"<<endl;
//(3)测试:+,并输出a+b的结果
cout<<"a+b的结果如下:"<<endl;
cout<<a+b<<endl;
cout<<"--------------------------"<<endl;
//(4)测试:=,将a赋给c,并输出c
cout<<"执行c=a之后,c的值如下:"<<endl;
c=a;
cout<<c;
cout<<"--------------------------"<<endl;
//(5)测试:整数左乘矩阵,计算a1*c并输出
cout<<"测试整数左乘矩阵"<<endl;
cout<<"整数为:"<<a1<<endl;
cout<<"矩阵为:"<<endl<<c;
cout<<"整数左乘矩阵结果如下:"<<endl;
cout<<a1*c;
cout<<"--------------------------"<<endl;
//(6)测试:整数右乘矩阵,计算c*a2并输出
cout<<"测试整数右乘矩阵"<<endl;
cout<<"整数为:"<<a2<<endl;
cout<<"矩阵为:"<<endl<<c;
cout<<"整数右乘矩阵结果如下:"<<endl;
cout<<c*a2;
cout<<"--------------------------"<<endl;
//(7)测试:前置自增++,计算d=++c并输出
cout<<"测试前置自增++"<<endl;
cout<<"c的初始值如下:"<<endl;
cout<<c;
cout<<"d=++c执行之后结果如下:"<<endl;
d=++c;
cout<<"c的结果如下:"<<endl;
cout<<c;
cout<<"d的结果如下:"<<endl;
cout<<d;
cout<<"--------------------------"<<endl;
//(8)测试:后置自增++,计算e=c++并输出
cout<<"测试后置自增++"<<endl;
cout<<"c的初始值如下:"<<endl;
c=a;
cout<<c;
cout<<"e=c++执行之后结果如下:"<<endl;
e=c++;
cout<<"c的结果如下:"<<endl;
cout<<c;
cout<<"e的结果如下:"<<endl;
cout<<e;
cout<<"--------------------------"<<endl;
return 0;
}
尝试多种解决办法后无果,最终经过多方查询和验证后才得知,问题就出在这一句
friend ostream &operator<<(ostream &,Matrix &);
首先,要明确一个概念,C语言所执行的函数会返回一个结果,那么这个结果当然是需要储存的,那么他会以什么形势去存储的?答案就是临时变量,那么,既然是临时的,所以它是不允许被更改,除此之外,你也不能将它作为一个非coust引用的参数,a+b就是作为一个临时变量,所以cout>>a+b这种,因为之前重载过>>,所以>>第二个参数就无法引用a+b,而如果这样写
c=a+b;
cout>>c;
这样是允许的,因为这样相当于把临时变量的值赋给了c,而c不是临时变量,是可以进行输出的
那么,如果我不想改变cout>>a+b,但是仍然输出a+b,有没有办法呢?自然是有的
之前说过,临时变量无法作为被非const引用参数,那么你将它改成coust引用参数不就好了
friend ostream &operator<<(ostream &,const Matrix &);
结果是可以输出的