2013-05-31 5 views
-2

Я определил класс Player для выполнения некоторых операций, поэтому мне удобно перегрузить некоторые базовые операторы. В частности, я хочу использовать < для сравнения между объектами Player. В этом классе у меня есть следующее:Перегрузка '<' Перерыв оператора << для cout?

bool operator<(const Player& rhs) const {return (*this < rhs);} 

К сожалению, это привело к проблемам. Позже, когда я пытаюсь вывести вектор, содержащий определенные элементы в моей основной функции, компилятор позволяет мне знать, что нет совпадения для операнда < <, и он ожидает, что std :: ostream < < Игрок. Ниже линия вызывает вопрос:

vector<Player> playerVec(6); 

for (int i = 0; i < 6; i++) { 

cout << playerVec[i]; 

} 

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

У меня есть представление о том, что происходит, поскольку компилятор принимает мое конкретное определение для <, а затем не удосуживается искать более общий случай. Мой вопрос заключается в том, нужно ли мне теперь перегружать оператор < <, чтобы вернуть его общую функциональность, или есть более простое решение?

Благодарим за предоставленную помощь!

+1

Покажите нам код, пожалуйста. – 0x499602D2

+6

Разве это не бесконечная рекурсия? – juanchopanza

+2

Если вы хотите вывести свой объект, вы должны перегрузить << operator для этого, его не зависит от оператора <перегрузка –

ответ

7

Я предполагаю, что вы имеете дело с двумя отдельными вопросами:

1) Вы отсутствующие std::ostream& operator<<(std::ostream&, const Player&), который является тем, что вам нужно для того, чтобы поток Player объектов std::cout и другой продукции потоков

2) У вас есть бесконечная рекурсия в вашем Player операторе меньше, чем сравнение <, так как оператор вы сами предоставляли звонки.

+0

1) Я не пытаюсь вывести объекты Player в поток, однако, поэтому я не перегрузил <<. Я просто хочу вывести вектор. Я редактировал исходное сообщение, чтобы показать конкретный вызов. 2) Пожалуйста, уточните. Думаю, я понимаю, но как в таком случае я сравню объект игрока с текущим? Я понял, что параметр rhs будет достаточным, но теперь я вижу проблему. –

+0

@Rome_Leader 1) Что вы подразумеваете под выводом вектора? Ваш код буквально говорит о потоке объекта Player. 2) Вы сравниваете членов объекта Player, как вы считаете нужным. Например: 'return id == rhs.id;' –

+0

@Rome_Leader: для вывода контейнера (вектора) из 'Player' вы должны иметь возможность выводить отдельный« Player ». Что вы ожидаете при выводе вектора «Player»? –

1

Я не думаю, что ваш operator<() вмешивается. В зависимости от сложности вашего кода вы можете проверить это, просто комментируя его и проверяя, не получите ли вы ту же ошибку.

Необходимо указать std::ostream & operator<<(std::ostream & os, const Player & p) не-член-функцию или иначе компилятор не знает, что делать, пишет что-то вроде os << myPlayer.

Смежные вопросы