有关C++ cout 输出问题 为什么下面的代码会报错,如果用注释的写法就是对的

#include<iostream>usingnamespacestd;classtest{private:inta;public:test(intc=0){a=c;}t... #include <iostream>
using namespace std;
class test
{
private:
int a;
public:
test(int c=0){a=c;}
test operator+(test &t){return test(a+t.a);}
friend ostream &operator<<(ostream &os,test &t);
};
ostream &operator<<(ostream &os,test &t)
{
os << "a=" << t.a;
return os;
}
int main()
{
test t1,t2;
t1=test(1);
t2=test(2);
//t1=t1+t2;
cout << t1+t2; //cout << t1;
return 0;
}
编译器显示一大堆类似cannot convert 't1.test::operator+((* & t2))' (type 'test') to type 'const unsigned char*'这样的东西,也就是说编译器把cout << t1+t2;中的t1+t2当做函数类型,并没有先算t1+t2,然后返回test类型。有什么解决办法吗?
(我用的是MingW编译器,在eclipse上写的c++)
展开
 我来答
木有想到GK5ym
2016-08-23 · TA获得超过208个赞
知道小有建树答主
回答量:207
采纳率:90%
帮助的人:123万
展开全部
<<运算优先级比+运算高,所以会先cout << t1,然后再+t2,cout与test是的+法运算是未定义的,所以出错了。
cout << (t1+t2); 可以加括号的处理

-------------------------------------------------------------------------------------
刚查了下优先级比,发现是+号优先于<<的,你这可能是编译器的问题。
因为+返回一个临时对象,可能跟临时对象的处理有关

除了用()外,你可以试试下面的代码
friend ostream &operator<<(ostream &os,test &t);
改成
friend ostream &operator<<(ostream &os,const test &t);

-------------------------------------------------------------------------------------
刚用代码测了下,的确是需要加上const的才可以。不加const的话,不管加不加括号都会出错。
看来的确是临时对象的关系,临时对象是实际是const的,所以找最匹配的<<运算时,friend ostream &operator<<(ostream &os,test &t); 不通过的。
最后找到const unsigned char*了,但const test是转不成const unsigned char*的,所以报了上面的错误
更多追问追答
追问
我加()还是不行。
加const不对吧,因为不是成员函数,编译器报错了。
追答
把最后的const的去掉,只要参数里面的const。
这个经验告诉我们,c++写函数参数的时候,能加const的最好都加上

另外vc6.0对类型的检测并不是很严格,vs后面的版本都挺严格的
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友0ebca8dcc
2016-08-23 · TA获得超过222个赞
知道小有建树答主
回答量:214
采纳率:2%
帮助的人:71.6万
展开全部

诡异的事情发生了

我的编译链接,全成功了

你用的什么编译器,比VC6.0还老!

那,你试一试这么写

cout<<(t1+t2);

看看结果

追问
好郁闷,我用的是最新的MINGW
加了括号也不对
追答
哎,新版MINGW不如老板VC6.0,真糟糕
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2016-08-23
展开全部
对象不可以这样+操作 。。。。。。。。。。。。。。。
要两个输出,就两次
cout<<t1<<t2;
追问
我已经重载+运算符了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式