Оператор С++ 14 ‹‹ для вставки потока и класса enum

Я пишу игру, в которой есть 2 игрока, «ЧЕРНЫЙ» и «БЕЛЫЙ».

У меня есть следующий класс enum:

enum class PlayerType
{
    BLACK, WHITE
};

Я хотел бы написать оператор ostream‹‹ для этого класса. Вот моя попытка:

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

    return os;
}

Однако я получаю следующую ошибку компилятора:

operator<< must take exactly 1 argument

Я думаю, проблема в том, что я вставляю класс перечисления и оператор‹‹ внутри другого класса; class Player.

Могу ли я что-нибудь сделать с этим, не удаляя перечисление из этого класса?


person FreelanceConsultant    schedule 20.12.2015    source источник
comment
Удалите функцию из этого класса.   -  person Pete Becker    schedule 20.12.2015


Ответы (2)


Могу ли я что-нибудь сделать с этим, не удаляя перечисление из этого класса?

Если это имеет смысл, вы можете объявить оператор как friend из Player. Это делает его нечленом. Тем не менее, вы должны спросить себя, действительно ли дружба является теми отношениями, которые вам нужны между оператором и классом. Если нет, переместите оператор за пределы определения класса.

person juanchopanza    schedule 20.12.2015

При объявлении любого из бинарных операторов как члена, отличного от static, они будут принимать один аргумент в дополнение к неявному объекту, на который указывает this. Объект, на который указывает this, всегда является левым аргументом бинарного оператора, а объявленный аргумент — правым аргументом. Операторы с дополнительными аргументами недопустимы.

Поскольку классы потока должны быть слева от оператора <<, вы не можете определить операторы потока как члены, не являющиеся членами static. Единственный реальный вариант сделать их функциями, не являющимися членами. Использование функции friend для определения оператора вывода по-прежнему эффективно объявляет функцию, не являющуюся членом.

person Dietmar Kühl    schedule 20.12.2015