【问题标题】:Getting the compiler to perceive << as defined for a specific class让编译器感知 << 为特定类定义
【发布时间】:2010-05-13 17:09:16
【问题描述】:

我用这个问题编辑了我的帖子,但没有得到任何答案。

我在 score.cpp 中为类Score(在 score.h 中定义)重载了

ostream& operator<< (ostream & os, const Score & right)
{
 os << right.getPoints() << " " << right.scoreGetName();
 return os;
}

getPoints 获取一个int 属性,getName 一个string 一个)

我在 main() 中的测试中收到此编译错误,包含在 main.cpp 中

binary '<<' : no operator found which takes a right-hand operand of type 'Score' (or there is no acceptable conversion)

为什么编译器不“识别”该重载是有效的? (包括是正确的)

感谢您的宝贵时间。

编辑:

根据要求,导致错误的代码:

cout << ":::::\n" << jogador.getScore() << endl;

jogador 是一个Player 对象,其中包含一个ScoregetScore 返回该属性。

【问题讨论】:

  • 您绝对应该发布导致错误的代码

标签: c++ class operator-overloading


【解决方案1】:

也许您没有在score.h 中声明您的operator&lt;&lt;?它通常应包含以下内容:

ostream& operator<< (ostream & os, const Score & right);

编辑:更准确地说,应该是:

std::ostream &operator<<(std::ostream &os, const Score &right);

您绝对应该在标题中包含using namespace std;,因此您需要std:: 才能使其正常工作。

【讨论】:

  • 那不行,因为左边的参数不是Score类型的。至少,这里的另一个问题让我这么想。
  • @Francisco P. - 编译器抱怨的是右值,而不是左值。即担心右手参数。
  • 这一行不要放在类声明中,放在类声明之后
  • Herb Sutter:“运算符gotw.ca/publications/mill02.htm
  • @francisco:这就是它必须成为这样一个全局函数的原因。作为全局函数,左操作数作为第一个参数(ostream &),右操作数作为第二个参数(Score const &)。
【解决方案2】:

尝试将operator&lt;&lt; 声明为您班级中的朋友函数:

struct Score
{
  friend ostream& operator<<(ostream& output, const Score& right);
};

这将使您的Score 结构很好地适应打印语句:

Score my_score;
cout << my_score << endl;

如有疑问,请查看C++ FAQ

【讨论】:

  • 我一直在寻找一种不同的方法来做到这一点。即使它有效,我也没有理由需要与 operator
  • 如果 Score::getPoints() 和/或 Score::scoreGetName() 是私有的,这个答案很有帮助。但根据接口原则,我认为您不需要围绕它的结构分数。
猜你喜欢
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
相关资源
最近更新 更多