我已经定义了一个Player类来进行一些操作,所以我可以方便地重载一些基本操作符。具体来说,我想使用<用于Player对象之间的比较。因此,我在课堂上有以下内容:
bool operator<(const Player& rhs) const {return (*this < rhs );}
不幸的是,这导致了问题。后来,当我尝试在main函数中输出包含特定元素的向量时,编译器让我知道&lt;&lt;&lt;&lt;操作数,它期望std :: ostream&lt;&lt;播放器。以下是导致问题的一行:
vector<Player> playerVec(6);
for (int i = 0; i < 6; i++) {
cout << playerVec[i];
}
请注意,我实际上并不希望将任何Player对象直接输出到流,因此我认为我不需要重载&lt;&lt;。
我知道发生了什么,因为编译器采用了我的特定定义&lt;然后不打扰寻找更一般的情况。我的问题是,我现在需要重载&lt;&lt;运算符返回其一般功能,还是有更简单的解决方案?
感谢您提供的任何帮助!
答案 0 :(得分:7)
我猜你正在处理两个不同的问题:
1)您缺少std::ostream& operator<<(std::ostream&, const Player&)
,这是将Player
对象流式传输到std::cout
和其他输出流所需的内容
2)您的Player
小于比较运算符<
中的无限递归,因为您提供的运算符会自行调用。
答案 1 :(得分:1)
我不认为,你的operator<()
正在干扰。根据代码的复杂程度,您可以通过简单地将其注释掉并检查是否收到相同的错误来验证这一点。
您需要指定std::ostream & operator<<(std::ostream & os, const Player & p)
非成员函数,否则编译器不知道写os << myPlayer
之类的内容。