假设我有以下课程:
class Example
{
int m_a;
int m_b;
public:
// usual stuff, omitted for brevity
friend ostream & operator<< (ostream & os, const Example &e)
{
return os << m_a << m_b;
}
};
我想保留cin
的默认行为,但在写入ofstream
时采用以下格式:
m_a , m_b
我试过在这里搜索,但没有发现任何类似的问题。
我尝试过在网上搜索,但仍然没有找到任何帮助。
我试图添加
friend ofstream & operator<< (ofstream & ofs, const Example &e)
{
return ofs << m_a << ',' << m_b;
}
进入类,但是产生了编译器错误。说实话,这种方法感觉不对,但在来这里寻求帮助之前我必须先尝试一下。
答案 0 :(得分:2)
链接运算符时,所有标准<<
都会返回ostream&
引用。
然后您的return ...
将无效,因为该值与ofstream&
返回类型不匹配。
只需在用户定义的ostream&
中使用operator<<
即可。
答案 1 :(得分:0)
字符串的语法是"S"
,即使它是一个字符字符串。并且fstream
采用字符串而不是字符。因此,这应该有效:
friend ofstream & operator<< (ofstream & ofs, const Example &e)
{
ofs << e.m_a << "," << e.m_b; // " instead of '
return ofs;
}
答案 2 :(得分:0)
我最初认为你在实现中忘记了对象e。
friend ostream & operator<< (ofstream & ofs, const Example &e)
{
return ((ostream&) ofs) << e.m_a << ',' << e.m_b;
}
使用以下说明,在类中有2个参数的友元二元运算符是在类体中声明的本质外部方法。
但是在用clang ++编译后,ofstream&lt;&lt; int抱怨错误:二进制表达式('ofstream'(又名'basic_ofstream')和'int')的操作数无效,你还应该将强制转换添加到ostream。
实际上是&lt;&lt; int不知道是否应该使用ofstream&lt;&lt;等式或ostream&lt;&lt; int和歧义导致编译错误。
因此,您应该了解可能导致未来编译错误的重载。