2014-04-21 148 views
-3

我是C++的初学者,我有以下问题。 当我在VS2013中运行以下代码时,出现错误。C++ operator <<重载

class Y{ 
public: 
    Y(int un_x, int un_y) 
    : x_(un_x), y_(un_y) {} 

    int x() const { 
     return x_; 
    } 
    int y() const { 
     return y_; 
    } 
private: 
    int x_; 
    int y_; 
}; 
class X{ 
    private: 
     Y coord; 
    public: 
    // some code ... 

     Y position() const { 
      return coord; 
     } 

     void display(ostream& output) const { 
      output << "The object is in position " << position(); 
     } 
}; 




ostream& operator<<(ostream& output, Y x){ 
    output<< "(" << x.x() << ", " << x.y() << ")" << endl; 
    return output; 
} 

如果我创建类X的对象some_object并尽量做到:

cout << some_object ; 

我得到followng错误:

error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const Y' (or there is no acceptable conversion) 
+0

您无法运行该代码,因为没有实际的代码可以运行(如主功能)。如果你的意思是你在代码下面提到的内容,那么输出'X'不会超载。 – chris

+1

上面链接的代码由MooingDuck编译并在VS2013下正确运行。请发布重现问题的[SSCCE](http://sscce.org)。 – Praetorian

+2

另外,'X'与这个问题有什么关系? –

回答

7

是在<<操作之后定义你尝试使用它 - 那是在display()函数之后?如果是这样,你将需要可以移动它,使它在使用之前定义的,或者至少是,声明它(即,因为它提供了一个原型):

ostream& operator<<(ostream &output, Y x); 

一点题外话,你应该不断的参考,而不是按值传递的Y实例:

ostream& operator<<(ostream& output, Y const& x); 
+0

嗯,这会教我认为X是无关紧要:http://coliru.stacked-crooked.com/a/3e58bfe2f577ee43 :( –

+0

没错,现在它的工作,非常感谢你 –

+0

+1我真的需要开始张贴这样的长篇大论评论= P尼斯回答之前阅读的答案。 – WhozCraig

0

你只超载了operator <<Y类,你没有超载它X类。所以它找不到一个。除此之外,你应该通过常量引用将Y传递给操作符。

这是基于你的陈述,你试过cout << some_object其中some_objectX。如果您尝试使用some_object.display(),则可能会遇到其他用户描述的问题。

如果这是一个错字,那么答案,而不是移动到聂的帖子,但我要再次强调,你应该通过引用或常量引用

+0

我不是downvoting你因为这个问题缺乏细节,但据推测,因为他的重载'运营商<<''为Y'中,OP是路过的一个实例'Y'而不是'X'为'运营商<<'。 – Praetorian

+0

@Praetorian但他没有阅读问题和前右它的语句,其产生的误差。 – UpAndAdam

+0

哎呀,看样子我没看过这个问题完全要么。对于先前的评论道歉。但是,考虑到错误消息,则*不*外观像他的传球在Y'的'一个实例。 – Praetorian

0

您收到此错误,因为ü没有宣布的ostream &操作<通<(ostream的&输出,Y X)为Y的友元函数 以使此功能为Y的友元函数尝试为X不能够访问你的两个声明的函数

朋友ostream的&操作< <(ostream的01输出,Y x);

+0

他为什么需要这样做?他只使用公共职能。你错了。 – UpAndAdam

+0

你需要这个,因为Y的运算符<<不可用于X. 并且通过朋友功能他可以实现他想要的。 –

+0

除了你没有。它没有被定义为任何人都可以使用的类成员,它被定义为一个自由函数。因此,他只使用公开课的方法。 – UpAndAdam