2013-05-31 143 views
-2

我已经定义了一个Player类来完成一些操作,所以我很方便重载一些基本的操作符。具体来说,我想用<来比较Player对象。因此,我在课堂上有以下几种:为cout重载'<'Operator Breaks <<?

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

不幸的是,这导致了问题。后来,当我尝试在我的主函数中输出包含特定元素的矢量时,编译器让我知道操作数不匹配,并且它期望std :: ostream < < Player。下面是导致此问题的行:

vector<Player> playerVec(6); 

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

cout << playerVec[i]; 

} 

注意,我真的不希望输出的任何播放器直接反对流,所以我不认为我需要重载< <。

我对发生了什么有一些想法,因为编译器需要我的具体定义<,然后不打扰寻找更一般的情况。我的问题是,我现在是否需要重载运算符以返回其通用功能,还是有更简单的解决方案?

感谢您提供的任何帮助!

+1

请给我们的代码。 – 0x499602D2

+6

这不是无限递归吗? – juanchopanza

+2

如果你想输出你的对象,你应该重载<<运算符,它不依赖于运算符<过载 –

回答

7

我猜测你是在处理两个不同的问题:

1)你缺少std::ostream& operator<<(std::ostream&, const Player&),这是你为了流Player对象std::cout等输出需要流

2)您的Player小于比较运算符<中有一个无限递归,因为您提供的运算符自己调用。

+0

1)我不想输出播放器对象流,但是,所以我没有超载<<。我只想输出一个矢量。我编辑了原文,以显示特定的电话。 2)请详细说明。我想我明白你的观点,但是在这种情况下,我会如何比较玩家对象和当前对象呢?我认为rhs参数就足够了,但现在我看到了这个问题。 –

+0

@Rome_Leader 1)输出矢量是什么意思?你的代码从字面上说是流播放器对象。 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的文件。