私が調査したところ、cout の出力ストリーム演算子をオーバーロードしたい場合、正しい方法は次のようにすることであることがわかりました。
std::ostream& operator<<(std::ostream& os, const T& obj)
ここで起こっていることは、operator<< が実際には ostream で定義されたフレンド関数であり、それを利用しているためです。しかし、問題は、この関数が ostream でどのように定義されているかということです。この関数は 2 つのパラメーターを取り、2 番目のパラメーターはユーザー定義であるため、そこに何が来るかを推測する方法はありません。
クラス固有のオーバーロードは次のようになります。
std::ostream& operator<<(std::ostream& os, const MyClass& obj)
特にC++にはジェネリッククラス(Javaのオブジェクトなど)がないため、コンパイラ/ライブラリは2番目のパラメーターのジェネリック定義をどのように取得しますか?