如果我不返回din或dout会发生什么,实际上我正在读一本书,其中作者返回流引用
istream & operator>>(istream &din,vector &a) { for(int i=0;i<size;i++) din>>a.v[i]; return din; } ostream & operator<<(ostream &dout,vector &a) { dout<<"("<<a.v[0]; for(int i=1;i<size;i++) dout<<","<<a.v[i]; dout<<")"; return dout; }
解决方法
原因是几个事实的组合.
在>> x>> Ÿ;
out<< z<< std :: precision(10)<< t<<的std :: ENDL; 所以你必须返回一些允许运算符<<再次.
>既然您希望运算符处理任何istream,即从std :: istream派生的任何对象,则无法定义
operator<<(istream_type,object); //按值获取istream 因为这只适用于特定的istream类型istream_type,但不适用于通用istream.为此,必须使用多态,即获取引用或指针(它将是一个引用或指向从std :: istream派生的类的指针).
>由于您只有对istream的引用,因此您无法返回istream对象本身(可能是在运算符<<的定义点上甚至没有定义的类型),而只返回您已获得的引用. 人们可以通过定义运算符<<来解决这个限制.一个模板并按值获取并返回istream_type,但这需要istream类型具有一个复制构造函数,它可能没有充分的理由.
>为了唤起多态性,原则上可以使用指针(对流)而不是引用.但是,运算符<<(stream *,const char *)是
C中不允许(至少有一个操作数必须是类或枚举类型).
因此,对于流指针,必须使用函数调用语法,然后使用C风格的fprintf(stream *,args …).
此外,指针可以为null或悬空,实际上它们是默认状态(在没有初始化程序时声明),而引用可以假定为有效(不能在没有初始化程序的情况下声明它).