我目前正在开发一个现有库的端口,该库利用 ostream 写入终端。
ostream 是作为端口的一部分派生的。
使用的 ostream 派生类定义如下:
class owstream: public std::ostream {
public:
CTerminal * output;
giac::context * contextptr;
owstream(CTerminal *, giac::context * contextptr , int = 0);
virtual ~owstream();
};
这用于输出一些数据,通常是整数和双精度数。
问题是我正在使用的平台有一个错误的双打印例程,导致内核崩溃。
所以在某些情况下,如果我这样做:
ostream* mystream = new ostream(...);
(*mystream) << 1.23456
卡布姆
所以,我试图覆盖特定类型的 << 运算符,如下所示:
ostream* GetStream() { return = new MyOStream(...); }
....
ostream* mystream = GetStream()
mystream << 1.23456;
不幸的是,ostream 中的 operator<< 成员不是虚拟的,因此如果我创建了一个重写的 operator<< 成员,就永远不会被调用。
我试图用类似的东西来扩展它:
class owstream: public std::ostream {
friend std::ostream& operator<<(std::ostream& out, double val);
public:
CTerminal * output;
giac::context * contextptr;
owstream(CTerminal *, giac::context * contextptr , int = 0);
virtual ~owstream();
};
extern std::ostream& operator<<(std::ostream &out, double val);
但这会导致关于 operator << 不明确的编译错误,因为显然这是一个已由基 iostream 类处理的类型。
我开始怀疑这是否可能。
当给定一个特定的、已经处理的类型时,你将如何实现 << 运算符来覆盖行为?
能够执行以下操作的目标:
cout << 1.234567
不会崩溃(我显然不会使用 cout,但上面定义的 GetStream() 可以很好地返回 cout)