0

「BLACK」と「WHITE」の 2 人のプレイヤーがいるゲームを書いています。

次の列挙型クラスがあります。

enum class PlayerType
{
    BLACK, WHITE
};

このクラスの ostream operator<< を書きたいと思います。これが私の試みです:

std::ostream& operator<<(std::ostream& os, const PlayerType& pt)
{
    if(pt == PlayerType::BLACK)
        os << "Black";

    return os;
}

ただし、次のコンパイラ エラーが発生します。

operator<< must take exactly 1 argument

問題は、enum クラスと operator<< を別のクラス内にネストしていることだと思います。class Player.

このクラス内から列挙型を削除せずにこれについてできることはありますか?

4

2 に答える 2

2

このクラス内から列挙型を削除せずにこれについてできることはありますか?

意味がある場合は、演算子をfriendofとして宣言できますPlayer。これにより非会員となります。ただし、友情がオペレーターとクラスの間に本当に必要な関係であるかどうかを自問する必要があります。そうでない場合は、演算子をクラス定義の外に移動します。

于 2015-12-20T16:23:11.113 に答える
0

二項演算子のいずれかを非staticメンバーとして宣言すると、 が指す暗黙のオブジェクトに加えて、1 つの引数を取りますthis。が指すオブジェクトthisは常に二項演算子の左側の引数であり、宣言された引数は右側の引数です。追加の引数を持つ演算子は無効です。

ストリーム クラスはオペレーターの左側にある必要がある<<ため、ストリーム オペレーターを非staticメンバーとして定義することはできません。それらを非メンバー関数にすることが唯一の現実的なオプションです。関数を使用friendして出力演算子を定義しても、非メンバー関数は効果的に宣言されます。

于 2015-12-20T22:00:11.620 に答える