C++ 奥斯特雷姆公司;操作员<&书信电报;不带刷新的segfaults()

C++ 奥斯特雷姆公司;操作员<&书信电报;不带刷新的segfaults(),c++,operators,iostream,C++,Operators,Iostream,我有一个自定义类,我为它定义了一个自定义castoperator char(),称它为a。现在,假设我想要一个这个类的数组,但是有附加的功能,所以我定义了一个新的类B,用std::vector类型的成员变量array来实现这一点 我希望B处理的事情之一是将其数据打印到屏幕上,因此我创建了一个friend函数 ostream& operator<<(ostream& out, const B& b) { // invoking custom cast wo

我有一个自定义类,我为它定义了一个自定义cast
operator char()
,称它为
a
。现在,假设我想要一个这个类的数组,但是有附加的功能,所以我定义了一个新的类
B
,用
std::vector
类型的成员变量
array
来实现这一点

我希望
B
处理的事情之一是将其数据打印到屏幕上,因此我创建了一个
friend
函数

ostream& operator<<(ostream& out, const B& b)
{
   // invoking custom cast works fine here
   for(int i=0;i<array.size();++i) out.put((char)array[i]); 
   // without the following out.flush() we get segfault
   out.flush()
}

ostream&operator您必须在那里返回一些内容。当然,您已经获得了流,因此您应该:

return out;

作为操作员的最后一行。请注意,可能是偶然的,调用
out.flush()
生成了一些寄存器(比如EAX)来保存流的值,因此被返回(根据标准调用约定),这是调用方所期望的。但是您必须添加最后一个
返回值

您必须在那里返回一些内容。当然,您已经获得了流,因此您应该:

return out;

作为操作员的最后一行。请注意,可能是偶然的,调用
out.flush()
生成了一些寄存器(比如EAX)来保存流的值,因此被返回(根据标准调用约定),这是调用方所期望的。但是您必须添加最后一个
返回值

您也可以发布
A
的代码吗?可能是因为您的
操作符char()
在某个地方犯了一个错误,之后您会受到惩罚。调用
out.flush()
时幸运的一个事实可能是因为调用了一个函数,修改了堆栈上可能出现的混乱,将其变成了一个更容易忍受的混乱!你能把
A
的代码也贴出来吗?可能是因为您的
操作符char()
在某个地方犯了一个错误,之后您会受到惩罚。调用
out.flush()
时幸运的一个事实可能是因为调用了一个函数,修改了堆栈上可能出现的混乱,将其变成了一个更容易忍受的混乱!就这样!这就是我深夜编码得到的。令人恼火的是,编译器没有警告我在非void中不返回。另外,为可能解释为什么
out.flush()
不会崩溃而干杯。很高兴提供帮助!:)你看,有人说在汇编程序中编程不算数,但它算数:)事实上,
flush
也会返回流,所以实际上函数实际上好像返回了流,但同样,
return
是必要的。的确,我今天的课程甚至是关于使用
-Wall
的微小的概念验证代码片段。就是这样!这就是我深夜编码得到的。令人恼火的是,编译器没有警告我在非void中不返回。另外,为可能解释为什么
out.flush()
不会崩溃而干杯。很高兴提供帮助!:)你看,有人说在汇编程序中编程不算数,但它算数:)事实上,
flush
也会返回流,所以实际上函数实际上好像返回了流,但同样,
return
是必要的。的确,我今天的课程甚至是关于代码使用的微小概念验证部分
-Wall