3

ユーザー定義クラスを使用したスト​​リーム操作の典型的なヘッダーが通常次Cのようなものである理由:

std::ostream& operator<<(std::ostream& os, const C& c);
std::istream& operator>>(std::istream& is, C&);

このようではありません:

template <class CharT, class Traits> 
std::basic_ostream<CharT, Traits>& operator<<(
        std::basic_ostream<CharT, Traits>& os
        const C& c);

template <class CharT, class Traits> 
std::basic_istream<CharT, Traits>& operator>>(
        std::basic_istream<CharT, Traits>& is
        C& c);

私の質問は、なぜストリーム演算子の通常のオーバーロードが ofのstd::ostreamtypedef である で行われるのか、なぜ直接行われないのかということです。charstd::basic_ostreamstd::basic_ostream

例えば:

class C
{
    ...
};

std::ostream& operator<<(std::ostream& os, const C& c)
{
    ...
}

int main()
{
    C c;
    std::wofstream myFile("myFile.txt");
    myFile << c; //Impossible
}

ここに書かれていることは、 ( 、、 ...)にoperator<<特化したストリーム オブジェクトのみを使用するように制限します。usingが よりも制限的である場合、ストリーム演算子のオーバーロードについて話すときになぜ言及されないのでしょうか?charstd::ostreamstd::ostringstreamstd::ostreamstd::basic_ostreamstd::basic_ostream

4

1 に答える 1