現在、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);
しかし、これは演算子 << があいまいであることに関してコンパイル エラーを引き起こします。明らかに、これは基本 iostream クラスによって既に処理されている型だからです。
これが可能かどうか疑問に思い始めています。
<< 演算子を実装して、特定の既に処理された型が与えられたときの動作をオーバーライドするにはどうすればよいでしょうか?
次のようなことができるようになることを目的としています。
cout << 1.234567
クラッシュしない (明らかに cout を使用しないだろうが、上で定義した GetStream() は cout を返す可能性が非常に高い)